এই সমস্যায় তিনটি মান L, R, এবং d দেওয়া আছে। আমাদের L থেকে R রেঞ্জের মধ্যে সব গুড নম্বর প্রিন্ট করতে হবে যাতে d তার অঙ্ক হিসেবে থাকে না।
একটি গুড নম্বর হলো সেই সংখ্যা যেখানে প্রতিটি অঙ্ক তার ডান পাশের সব অঙ্কের যোগফলের চেয়ে বড়। উদাহরণস্বরূপ, 732 একটি গুড নম্বর, কারণ 7 > 3+2 এবং 3 > 2।
উদাহরণ
ইনপুট: L = 400, R = 500, k = 3 আউটপুট: 410, 420, 421
ব্যাখ্যা - 400 থেকে 500 পর্যন্ত গুড নম্বরগুলো: 410, 420, 421, 430। কিন্তু 3 ব্যবহার করা যাবে না তাই 430 প্রিন্ট হবে না।
এই সমস্যাটি সমাধানের জন্য দেওয়া রেঞ্জের সব সংখ্যা (L থেকে R) চেক করা হবে। যদি কোনো সংখ্যা গুড নম্বর হয় এবং তার কোনো অঙ্ক k-এর সমান না হয়, তবে প্রিন্ট করা হবে।
গুড নম্বর চেক - সংখ্যাকে ডান থেকে বামে ট্রাভার্স করা হবে এবং একটি সাম ধরে রাখা হবে। যেকোনো মুহূর্তে যদি সাম পরের সংখ্যার চেয়ে বড় হয় তবে false রিটার্ন করা হবে।
বাস্তবায়ন
#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