इस समस्या में, हमें तीन मान L, R और d दिए गए हैं। हमारा काम सभी अच्छे नंबर . को प्रिंट करना है एल से आर की सीमा के भीतर जिसमें d का अंक नहीं है।
एक अच्छी संख्या एक संख्या है जिसमें प्रत्येक अंक अपने दाहिने अंकों के योग से बड़ा होता है (इससे सभी कम महत्वपूर्ण बिट्स)। उदाहरण के लिए, 732 एक अच्छी संख्या है, 7> 3+2 और 3>2।
अब, समस्या को समझने के लिए एक उदाहरण लेते हैं,
Input: L = 400 , R = 500 , k = 3 Output: 410, 420, 421
स्पष्टीकरण − 400 से 500 के बीच की अच्छी संख्याएँ हैं −
410, 420, 421, 430, but we cannot use 3 so 430 is not printed.
इस समस्या को हल करने के लिए, इसके लिए हम दी गई रेंज यानी L से R तक के सभी नंबरों की जांच करेंगे, यदि कोई संख्या एक अच्छी संख्या है और उसका कोई अंक k के बराबर नहीं है, तो उसे प्रिंट करें अन्यथा छोड़ दें।
अच्छे नंबर की जांच करें - हम संख्या को दाएं से बाएं पार करेंगे, और किसी भी बिंदु पर एक योग बनाए रखेंगे, यदि योग अगली संख्या से अधिक है तो झूठी वापसी करें।
उदाहरण
आइए नीचे दिए गए एल्गोरिथम को स्पष्ट करने के लिए प्रोग्राम देखें -
#include<bits/stdc++.h> using namespace std; bool isvalidNumber(int n, int d){ int digit = n%10; int sum = digit; if (digit == d) return false; n /= 10; while (n){ digit = n%10; if (digit == d || digit <= sum) return false; else{ sum += digit; n /= 10; } } return 1; } void printGoodNumbersLtoR(int L, int R, int d){ for (int i=L; i<=R; i++){ if (isvalidNumber(i, d)) cout << i << " "; } } int main(){ int L = 400, R = 600, d = 3; cout<<"All good numbers from "<<L<<" to "<<R<<" that do not contain "<<d<<" are :\n"; printGoodNumbersLtoR(L, R, d); return 0; }
आउटपुट
All good numbers from 400 to 600 that do not contain 3 are − 410 420 421 510 520 521 540