रेंज वेरिएबल के रूप में दो संख्याएं start और end दी गई हैं। लक्ष्य उन संख्याओं की गिनती ढूंढना है जो इस रेंज [start,end] में हैं और जिनके सम स्थिति के अंकों के योग और विषम स्थिति के अंकों के योग का अंतर अभाज्य है।
अर्थात (सम स्थिति के अंकों का योग)-(विषम स्थिति के अंकों का योग) = एक अभाज्य संख्या
उदाहरणों से समझते हैं।
उदाहरण के लिए
इनपुट - start = 230, end = 270
आउटपुट - रेंज में उन संख्याओं की गिनती जिनके सम और विषम स्थिति के अंकों के योग का अंतर अभाज्य है: 6
व्याख्या - 230 से 270 के बीच की संख्याएं जो शर्त को पूरा करती हैं:
240 ( 4-2 is 2 ), 250 ( 5-2 is 3 ), 251 ( 5-3 is 2 ), 261 ( 6-3 is 3 ), 262 ( 6-4 is 2 ), 270 ( 7-2 is 5 )।
ये सभी अंतर 2, 3 और 5 हैं जो अभाज्य हैं।
इनपुट - start = 1101, end = 1120
आउटपुट - रेंज में उन संख्याओं की गिनती जिनके सम और विषम स्थिति के अंकों के योग का अंतर अभाज्य है: 1
व्याख्या - 1101 से 1120 के बीच की संख्याएं जो शर्त को पूरा करती हैं:
1120 ( 3-1 is 2 )। 2 अभाज्य है।
नीचे दिए गए प्रोग्राम में उपयोग किया गया दृष्टिकोण
इसमें हम डायनामिक प्रोग्रामिंग दृष्टिकोण का उपयोग करते हैं और उन संख्याओं की गिनती संग्रहीत करते हैं जिनके सम और विषम स्थिति के अंकों के योग का अंतर अभाज्य है। यह सरणी arr[size][90][90][2] होगी। यहां size 10 की घात है। तो इनपुट के रूप में सबसे बड़ी संख्या 10size होगी।
फ़ंक्शन check(int place, int eve, int od, int temp, vector<int> vec) के प्रत्येक पुनरावर्ती कॉल में हम बाएं से दाएं 0 से 9 तक अंक रखकर एक संख्या बनाएंगे।
arr[size][x][y][temp] में, x रखे गए सम स्थिति के अंकों के योग के लिए x तक है और y रखे गए विषम अंकों के योग के लिए y तक है। सरणी arr_2[] का उपयोग करके जांचें कि आवश्यक अंतर अभाज्य है या नहीं जो क्रम में 100 तक की सभी अभाज्य संख्याओं को संग्रहीत करता है।
- वेरिएबल start और end को इनपुट के रूप में लें।
- ग्लोबल सरणी arr[size][90][90][2] और 100 तक की अभाज्य संख्याओं के लिए सरणी arr_2[] लें।
- फ़ंक्शन check(int place, int eve, int od, int temp, vector<int> vec) वर्तमान अंक की स्थिति को place के रूप में, सम स्थिति के अंकों के वर्तमान योग को even और विषम स्थिति के अंकों को od के रूप में, temp का मान और वेक्टर vec लेता है जिसमें इसके अंक हैं।
- यह arr[place][eve][od][temp] पर मानों को पुनरावर्ती रूप से भरता है।
- वर्तमान तत्व के लिए प्रारंभिक मान count=0 लें।
- वर्तमान स्थिति के लिए, चेक करें यदि place अंतिम स्थिति है यदि(place == vec.size()) का उपयोग करके। यदि हाँ तो जांचें कि वह स्थिति विषम या सम है।
- if(vec.size() & 1) का परिणाम true है तो वर्तमान स्थिति विषम है तो eve को od से स्वैप करें क्योंकि यह विषम लंबाई की संख्या है।
- योगों के अंतर के रूप में temp_2 की गणना करें eve-od।
- for लूप का उपयोग करके, arr_2[] को पार करें और चेक करें कि temp_2 मिला है या नहीं। यदि हाँ तो यह अभाज्य है। तो 1 लौटाएं अन्यथा 0 लौटाएं।
- यदि arr[place][eve][od][temp] पहले से गणना किया गया है तो यह -1 नहीं होगा तो इसे लौटाएं।
- यदि temp शून्येतर है तो temp_3=9 सेट करें। Temp_3 वह अधिकतम सीमा है जो हम रख सकते हैं। यदि यह 0 है तो vec[place] रखें अन्यथा संख्या पहले से छोटी है तो कोई भी अंक कहें 9 रखें।
- अंकों को 0 से temp_3 तक पार करें। यदि वर्तमान स्थिति विषम है तो set_odd = set_odd + i; अपडेट करें (पिछला विषम स्थिति योग + वर्तमान अंक i )।
- यदि वर्तमान स्थिति सम है तो set_even = set_even + i; अपडेट करें (पिछला सम स्थिति योग + वर्तमान अंक i )।
- count += check(place + 1, set_even, set_odd, set_temp, vec); सेट करें और arr[place][eve][od][temp] = count लौटाएं।
- फ़ंक्शन place_prime(int val) संख्या val लेता है और LSB से MSB तक इसके अंक रखने वाला एक वेक्टर vec उत्पन्न करता है।
- पूरी सरणी arr[][][][] को -1 से सेट करें।
- count = check(0, 0, 0, 0, vec) लें जो अंत में परिणाम लौटाएगा।
- परिणाम के रूप में count लौटाएं।
उदाहरण
#include <bits/stdc++.h> using namespace std; const int size = 18; int arr[size][90][90][2]; //पहले 100 अभाज्य संख्याएं int arr_2[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }; int check(int place, int eve, int od, int temp, vector < int > vec) { int count; int temp_3; if (place == vec.size()) { if (vec.size() & 1) { swap(od, eve); } int temp_2 = eve - od; for (int i = 0; i < 24; i++) { if (temp_2 == arr_2[i]) { return 1; } } return 0; } if (arr[place][eve][od][temp] != -1) { int set = arr[place][eve][od][temp]; return set; } if (temp) { temp_3 = 9; } else { temp_3 = vec[place]; } for (int i = 0; i <= temp_3; i++) { int set_temp = temp; int set_even = eve; int set_odd = od; if (i < vec[place]) { set_temp = 1; } if (place & 1) { set_odd = set_odd + i; } else { set_even = set_even + i; } count += check(place + 1, set_even, set_odd, set_temp, vec); } return arr[place][eve][od][temp] = count; } int place_prime(int val) { vector < int > vec; while (val) { vec.push_back(val % 10); val = val / 10; } reverse(vec.begin(), vec.end()); memset(arr, -1, sizeof(arr)); int count = check(0, 0, 0, 0, vec); return count; } int main() { int start = 20, end = 80; int count = place_prime(end) - place_prime(start - 1); cout << "Count of Numbers in Range with difference between Sum of digits at even and odd positions as Prime are: " << count; return 0; } यदि हम उपरोक्त कोड चलाते हैं तो यह निम्नलिखित आउटपुट उत्पन्न करेगा -
आउटपुट
Count of Numbers in Range with difference between Sum of digits at even and odd positions as Prime are: 15