यह C17 प्रोग्राम परीक्षण विभाजन से संख्याओं की जाँच करता है और 1 से ऊपरी सीमा n तक की अभाज्य संख्याएँ सूचीबद्ध करता है। इसमें n भी शामिल है। अभाज्य संख्या 2 या उससे बड़ा पूर्णांक होती है, इसलिए सीमा 0 या 1 होने पर कोई अभाज्य संख्या नहीं छपती। 0 से INT_MAX तक का एक दशमलव पूर्णांक दर्ज करें।
कोड
| |
संकलन और चलाने का उदाहरण
इसे primes.c नाम से सहेजें। GCC वाले परिवेश में gcc -std=c17 -Wall -Wextra -O2 primes.c -o primes चलाएँ, फिर ./primes चलाएँ। सीमा के रूप में 30 दर्ज करने पर शीर्षक के बाद यह पंक्ति छपती है:
| |
सीमा 2 होने पर 2 और 0 या 1 होने पर खाली पंक्ति छपती है। इनपुट पाठ की एक पंक्ति है, जिसमें नई पंक्ति के चिह्न को छोड़कर अधिकतम 127 बाइट स्वीकार किए जाते हैं। आगे-पीछे रिक्ति-वर्ण और आरंभ में + स्वीकार्य हैं। ऋणात्मक मान, खाली पंक्ति, पूर्णांक के रूप में अमान्य पाठ, सीमा से बाहर के मान, बहुत लंबी पंक्ति या पढ़ने में विफलता होने पर प्रोग्राम त्रुटि दिखाकर समाप्त हो जाता है। केवल पहली पंक्ति संसाधित होती है; बाद की पंक्तियों का उपयोग नहीं होता।
जाँच और इनपुट प्रबंधन कैसे काम करते हैं
isPrime1 या उससे छोटे मानों के लिए असत्य और 2 तथा 3 के लिए सत्य लौटाता है। 2 या 3 के अन्य गुणजों के लिए असत्य लौटाता है। इसके बादi = 5, 11, 17, ...के लिएiऔरi + 2की जाँच होती है। भाजक के संभावित मान6k - 1और6k + 1के रूप में हैं, 6 के गुणज नहीं। इन रूपों की हर संख्या अभाज्य भी नहीं होती।- हर भाज्य संख्या का कोई अभाज्य गुणनखंड उसके वर्गमूल से बड़ा नहीं होता। इसलिए
i <= num / iतक जाँच पर्याप्त है। धनात्मक पूर्णांकों के लिए यहi * i <= numवाला ही दायरा जाँचता है, लेकिनintके गुणन में अतिप्रवाह से बचाता है। फ़्लोटिंग-पॉइंट वर्गमूल निकालने की आवश्यकता नहीं है। - सीमा 2 से छोटी होने पर
printPrimesकेवल खाली पंक्ति छापता है। अन्यथा पहले 2 छापता है और फिर विषम संख्याओं की जाँच करता है।i > n - 2होने पर जोड़ने से पहले लूप समाप्त होता है। इससे सीमाINT_MAXहोने पर भी अंतिमi += 2में अतिप्रवाह नहीं होता। readLimitमेंfgetsसे पढ़ा जाता है, फिरstrtolके रूपांतरण-अंत सूचक औरERANGEकी जाँच होती है।intमें बदलने से पहले मान का 0 सेINT_MAXतक होना भी सुनिश्चित किया जाता है।isspaceका तर्क पहलेunsigned charमें बदला जाता है।scanf("%d", &n)का वापसी मान अनदेखा करने पर असफल इनपुट के बाद अप्रारंभितnइस्तेमाल हो सकता है। रूपांतरण का परिणामintकी सीमा से बाहर हो तो यह मान लेना भी सही नहीं है कि उसे साधारण रूपांतरण-विफलता की तरह संभाला जाएगा।
उपयोग की सीमा
INT_MAX कार्यान्वयन पर निर्भर करता है। 32-बिट int के लिए यह 2,147,483,647 है, लेकिन C हर कार्यान्वयन में यही मान अनिवार्य नहीं करता। किसी ऊपरी सीमा को निरूपित कर पाना यह नहीं बताता कि वहाँ तक की सभी अभाज्य संख्याएँ जल्दी छप जाएँगी।
यह कार्यान्वयन परीक्षण विभाजन सीखने के लिए है। एक संख्या की जाँच में विभाजनों की अधिकतम संख्या उसके वर्गमूल के समानुपाती होती है। सभी संभावित संख्याओं को सूचीबद्ध करने के लिए O(n sqrt(n)) विभाजन एक मोटी ऊपरी सीमा है। यहाँ एक विभाजन को एक संक्रिया गिना गया है; यह बिट-जटिलता या मापा गया समय नहीं है। बड़े दायरे में सूची बनाने के लिए एराटोस्थनीज़ की छलनी पर विचार करें। यह क्रिप्टोग्राफ़िक अभाज्य संख्या जनरेटर नहीं है। बड़े पूर्णांकों की जाँच के लिए Miller–Rabin का लेख देखें।
C के इनपुट फ़ंक्शन और पूर्णांक अंकगणित के नियम WG14 के C11 समिति मसौदे N1570 के खंड 6.5, 7.4, 7.21.6.2, 7.21.7.2 और 7.22.1.4 में देखे जा सकते हैं।
