इस पोस्ट में मैं आपको बताऊंगा कि पूरी तरह से बेकार चीज़ कैसे करें - C ++ टेम्प्लेट का उपयोग करके primes की गणना करें।
एल्गोरिदम को योजना कोड के साथ चित्रित किया गया है, इसलिए सावधान रहें: कोष्ठक!
नियंत्रण संरचनाओं
हम एक संकलन-समय फ़ंक्शन एनालॉग प्राप्त करना चाहते हैं। टेम्प्लेट पर प्रोग्रामिंग में, एक संरचना एक फ़ंक्शन के रूप में कार्य करती है, जिसके टेम्पलेट पैरामीटर फ़ंक्शन के तर्कों के अनुरूप होते हैं, और स्थिर स्थिर शब्द परिणामों के अनुरूप होते हैं।
(define (fx) (* xx)) (f 10)
समान C ++ कोड:
template<int x> struct f { static const int value = x * x; };
इस तरह के एक समारोह के "कॉल" टेम्पलेट की तात्कालिकता के माध्यम से होता है:
int main() { std::cout << f<10>::value << std::endl;
C ++ टेम्प्लेट आपको एक विशेष तरीके (विशेषज्ञता) में टेम्प्लेट मापदंडों के कुछ मूल्यों को संसाधित करने की अनुमति देता है। यह आपको सशर्त नियंत्रण संरचना को व्यवस्थित करने की अनुमति देता है:
(define (gx) (if (= x 0) 42 (* xx))) (g 10)
template<int x> struct g { static const int value = x * x; }; template<> struct g<0> { static const int value = 42; }; int main() { std::cout << g<10>::value << std::endl;
चक्रीय प्रसंस्करण को व्यवस्थित करने के लिए, हम पुनरावर्तन का उपयोग करेंगे। ऊपर वर्णित तकनीक किसी भी फ़ंक्शन का वर्णन करने के लिए पर्याप्त हैं।
प्रधान गणना
समस्या का बयान
हम एक ऐसा फंक्शन प्राप्त करना चाहते हैं, जो एक प्राइम लौटे:
int main() { std::cout << prime<0>::value << std::endl;
सादगी की परीक्षा
आप इस तरह के फ़ंक्शन को तुरंत लागू नहीं कर पाएंगे, आपको कुछ सरल से शुरू करने की आवश्यकता है। सबसे आसान तरीका यह है कि अगर कुछ n प्राइम नंबर है तो जांच लें। जाँच करने के लिए, हम यह सत्यापित करते हैं कि n-1 से 1 तक की सभी संख्याओं में n को विभाजित करने का शेष शून्य के बराबर नहीं है।
(define (is-prime n) (is-prime-rec n (- n 1))) (define (is-prime-rec n div) (if (or (= div 1) (= div 0)) #t (and (not (= 0 (remainder n div))) (is-prime-rec n (- div 1))))) (is-prime 2)
template<int n, int div> struct is_prime_rec { static const bool value = (n % div != 0) && is_prime_rec<n, div - 1>::value; }; template<int n> struct is_prime_rec<n, 1> { static const bool value = true; }; template<int n> struct is_prime_rec<n, 0> { static const bool value = true; }; template<int n> struct is_prime { static const bool value = is_prime_rec<n, n - 1>::value; }; int main() { std::cout << is_prime<1>::value << std::endl;
1 को प्राइम नंबर मानने का सवाल खुला है या नहीं, लेकिन सत्यापन के इस कार्यान्वयन में 1 को सरल माना जाता है।
अगला प्राइम नंबर ढूँढना
हम एक फ़ंक्शन को परिभाषित करते हैं जो दिए गए एक (यानी, निम्नलिखित) की तुलना में सबसे छोटा प्राइम नंबर पाता है।
(define (next-prime n) (if (is-prime (+ n 1)) (+ n 1) (next-prime (+ n 1)))) (next-prime 2)
template<int n> struct next_prime; template<int n, bool cond> struct next_prime_if { static const int value = n + 1; }; template<int n> struct next_prime_if<n, false> { static const int value = next_prime<n + 1>::value; }; template<int n> struct next_prime { static const int value = next_prime_if<n, is_prime<n + 1>::value>::value; }; int main() { std::cout << next_prime<1>::value << std::endl;
सिर्फ नंबर से नंबर ढूंढना
प्राइम नंबर क्या है? यह निम्नलिखित है (i-1) वें:
(define (prime i) (if (= i 0) 2 (next-prime (prime (- i 1))))) (prime 0)
template<int i> struct prime { static const int value = next_prime<prime<i - 1>::value >::value; }; template<> struct prime<0> { static const int value = 2; }; int main() { std::cout << prime<0>::value << std::endl;
पूर्ण स्रोत कोड:
स्कीम
pastebin.com/21VFjYt0C ++
pastebin.com/cfSvBRNH