ধরুন আমাদের কাছে D সংখ্যার একটি সাজানো সেট আছে, {'1', '2', '3', '4', '5', '6', '7', '8', 'এর একটি অ-খালি উপসেট। 9'} বাদে 0। এখন, আমরা এই সংখ্যাগুলি ব্যবহার করে কিছু সংখ্যা লিখব, প্রতিটি সংখ্যা যতবার চাই ততবার ব্যবহার করে। সুতরাং, যদি D ={'2', '3', '7'}, আমরা সংখ্যা লিখতে পারি যেমন '23', '771', '2372327'।
এখন আমাদেরকে ধনাত্মক পূর্ণসংখ্যার সংখ্যা খুঁজে বের করতে হবে যেগুলো লেখা যেতে পারে যেগুলো N এর কম বা সমান।
সুতরাং, যদি ইনপুটটি হয় D =[2,3,4,7], N =100, তাহলে আউটপুট হবে 20, যেমন সংখ্যাগুলি 2, 3, 4, 7, 22, 23, 24, 27 হতে পারে , 32, 33, 34, 37, 42, 43, 44, 47, 72, 73, 74, 77। অন্য সব সংখ্যা 100-এর বেশি।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=N কে স্ট্রিং এ রূপান্তর করুন
-
sz :=n এর আকার, ret :=0
-
আরম্ভ করার জন্য i :=1, যখন i
-
ret :=ret + (D এর আকার)^i
-
-
আরম্ভ করার জন্য i :=0, যখন i
-
hasSameNum :=মিথ্যা
-
D-
-এ প্রতিটি স্ট্রিং x এর জন্য-
যদি x[0]
-
ret :=ret + (D এর আকার)^(sz - i - 1)
-
-
অন্যথায় যখন x[0] n[i] এর মত হয়, তখন −
-
hasSameNum :=সত্য
-
-
-
না থাকলে hasSameNum অ-শূন্য হয়, তাহলে −
-
রিটার্ন রিটার্ন
-
-
-
রিটার্ন ret + 1
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: int atMostNGivenDigitSet(vector<string> &D, int N) { string n = to_string(N); int sz = n.size(); int ret = 0; for (int i = 1; i < sz; i++) { ret += pow(D.size(), i); } for (int i = 0; i < sz; i++) { bool hasSameNum = false; for (string &x : D) { if (x[0] < n[i]) { ret += pow(D.size(), sz - i - 1); } else if (x[0] == n[i]) { hasSameNum = true; } } if (!hasSameNum) return ret; } return ret + 1; } }; main(){ Solution ob; vector<string> v = {"2","3","4","7",}; cout << (ob.atMostNGivenDigitSet(v, 100)); }
ইনপুট
{"2","3","4","7"}, 100
আউটপুট
20