সমস্যা বিবরণ
দুটি ধনাত্মক ইন্টিজার N এবং K দেওয়া আছে। N থেকে ন্যূনতম কত ডিজিট মুছে ফেললে оставিত সংখ্যাটি ১০^K দিয়ে বিভাজ্য হবে তা বের করুন। অসম্ভব হলে -1 প্রিন্ট করুন।
উদাহরণ
N = 10203027 এবং K = 2 হলে ৩ ডিজিট মুছে ফেলতে হবে। ৩, ২ এবং ৭ মুছে ফেললে সংখ্যাটি হয় 10200 যা ১০^2 দিয়ে বিভাজ্য।
অ্যালগরিদম
1. সংখ্যাটি শেষ থেকে ট্র্যাভার্স করুন। যদি বর্তমান ডিজিট শূন্য না হয়, তবে কাউন্টার বাড়ান, অন্যথায় K কমান। 2. যদি K শূন্য হয়, তবে কাউন্টার রিটার্ন করুন। 3. পুরো সংখ্যা ট্র্যাভার্স করার পর চেক করুন K শূন্য কিনা। শূন্য হলে কাউন্টার রিটার্ন করুন, অন্যথায় N-এর ডিজিট সংখ্যা - ১ রিটার্ন করুন। 4. যদি সংখ্যাতে কোনো শূন্য না থাকে, তবে -1 রিটার্ন করুন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
int getBitsToBeRemoved(int n, int k) {
string s = to_string(n);
int result = 0;
int zeroFound = 0;
for (int i = s.size() - 1; i >= 0; --i) {
if (k == 0) {
return result;
}
if (s[i] == '0') {
zeroFound = 1;
--k;
} else {
++result;
}
}
if (!k) {
return result;
} else if (zeroFound) {
return s.size() - 1;
}
return -1;
}
int main() {
int n = 10203027;
int k = 2;
cout << "Minimum required removals = " << getBitsToBeRemoved(n, k) << endl;
return 0;
}
উপরের প্রোগ্রাম কম্পাইল ও এক্সিকিউট করলে নিচের আউটপুট জেনারেট হবে
আউটপুট
Minimum required removals = 3