हमें एक पूर्णांक रेंज, एक वेरिएबल m दिया गया है जिसका उपयोग भाजक के रूप में किया जाता है और एक वेरिएबल d जिसका उपयोग यह जांचने के लिए किया जाता है कि अंक 'd' सम स्थिति पर है या नहीं और कार्य रेंज में उन संख्याओं की गिनती करना है जो वेरिएबल m से विभाज्य हैं और सम स्थितियों में अंक d रखती हैं।
उदाहरण के लिए
इनपुट - int start = 20, end = 50, d = 8 and m = 4
आउटपुट - m से विभाज्य और सम स्थिति में अंक d वाली रेंज में संख्याओं की गिनती: 2
व्याख्या - रेंज 20 से 50 तक शुरू होती है। तो अंक d यानी 8 वाली संभावित संख्याएं 28, 38 और 48 हैं जिनमें 8 सम स्थितियों यानी 2 पर है और संख्याएं 24 और 48 m यानी 4 से विभाज्य हैं इसलिए गिनती 2 है।
इनपुट - int start = 10, end = 100, d = 6 and m = 2
आउटपुट - m से विभाज्य और सम स्थिति में अंक d वाली रेंज में संख्याओं की गिनती: 8
व्याख्या - रेंज 10 से 100 तक शुरू होती है। तो अंक d यानी 6 वाली संभावित संख्याएं 16, 26, 36, 46, 56, 66, 76, 86 और 96 हैं जिनमें 6 सम स्थितियों पर है सिवाय संख्या 6 और 66 के जो विषम स्थितियों पर हैं इसलिए हम इन्हें शामिल नहीं करेंगे और अब हम सूची से उन संख्याओं की जांच करेंगे जो 2 से विभाज्य हैं तो सभी संख्याएं यानी 16, 26, 36, 46, 56, 76, 86 और 96, 2 से विभाज्य हैं इसलिए गिनती 8 है।
नीचे दिए गए प्रोग्राम में उपयोग किया गया दृष्टिकोण
- वेरिएबल start से वेरिएबल end तक शुरू होने वाली पूर्णांक संख्याओं की एक रेंज बनाएं और वेरिएबल d और m घोषित करें और मान इनपुट करें। आगे की प्रोसेसिंग के लिए डेटा फ़ंक्शन को पास करें।
- vec नामक एक वेक्टर वेरिएबल बनाएं।
- वेरिएबल start के अंदर के मान तक while लूप शुरू करें। अब, while के अंदर मान को val % 10 के रूप में वेक्टर में पुश करें और val को val / 10 सेट करें।
- vec.begin() और vec.end() को तर्क के रूप में पास करके STL में रिवर्स फ़ंक्शन कॉल करें।
- memset का उपयोग करके सरणी में मान -1 सेट करें।
- set_total(0, 0, 0, vec) लौटाएं जो एक फ़ंक्शन है जो जांच करेगा कि सम स्थिति d वाली संख्याएँ m से विभाज्य हैं या नहीं
- set_total फ़ंक्शन के अंदर-:
- चेक करें IF place वेक्टर के आकार के बराबर है तो चेक करें IF temp = 0 तो 1 लौटाएं या 0 लौटाएं।
- चेक करें IF arr[place][temp][val] -1 के बराबर नहीं है तो arr[place][temp][val] पर मान लौटाएं।
- चेक करें IF place % 2 = 1 तो चेक करें IF val = 0 तो चेक करें IF d vec[place] से बड़ा है तो 0 लौटाएं
- वेरिएबल temp_2 घोषित करें और इसे 0 सेट करें।
- चेक करें IF d vec[place] से कम है तो temp_2 को 1 सेट करें।
- वेरिएबल temp_3 घोषित करें और set_total() को पुनरावर्ती कॉल करें और arr[place][temp][val] = temp_3 लौटाएं
- परिणाम संग्रहीत करने के लिए एक वेरिएबल count घोषित करें।
- वेरिएबल set_limit घोषित करें और इसे 9 सेट करें IF val 1 के बराबर है ELSE इसे vec[place] से सेट करें।
- i से 0 से set_limit तक FOR लूप शुरू करें और चेक करें IF i d के बराबर है तो continue
- एक वेरिएबल temp_2 घोषित करें और इसे val सेट करें
- चेक करें IF i vec[place] से कम है तो temp_2 को 1 सेट करें
- count को फ़ंक्शन set_total के पुनरावर्ती कॉल के साथ सेट करें
- arr[place][temp][val] = count लौटाएं।
उदाहरण
#include <bits/stdc++.h> using namespace std; int arr[20][20][2]; int d, m; int set_total(int place, int temp, int val, vector < int > vec) { if (place == vec.size()) { if (temp == 0) { return 1; } return 0; } if (arr[place][temp][val] != -1) { return arr[place][temp][val]; } if (place % 2) { if (val == 0) { if (d > vec[place]) { return 0; } } int temp_2 = val; if (d < vec[place]) { temp_2 = 1; } int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec); return arr[place][temp][val] = temp_3; } int count = 0; int set_limit = (val ? 9 : vec[place]); for (int i = 0; i <= set_limit; i++) { if (i == d) { continue; } int temp_2 = val; if (i < vec[place]) { temp_2 = 1; } count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec); } return arr[place][temp][val] = count; } int divisible(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)); return set_total(0, 0, 0, vec); } int main() { int start = 20, end = 50; d = 8, m = 4; int count = divisible(end) - divisible(start); cout << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count; return 0; } यदि हम उपरोक्त कोड चलाते हैं तो यह निम्नलिखित आउटपुट उत्पन्न करेगा -
आउटपुट
Count of Numbers in a Range divisible by m and having digit d in even positions are: 2