আমাদেরকে একটি ভেরিয়েবল থেকে শুরু করে একটি পূর্ণসংখ্যা পরিসীমা দেওয়া হয়েছে, ধরা যাক ভেরিয়েবলের শেষ পর্যন্ত শুরু এবং একটি পরিবর্তনশীল k এবং d। কাজটি হল একটি পরিসরে d সংখ্যার গণনা করা যাতে d ঠিক k বার হয়।
উদাহরণস্বরূপ
ইনপুট - int start =10, int end =100, d =4 এবং K =2
আউটপুট - একটি পরিসরে সংখ্যার গণনা যেখানে d সংখ্যাটি ঠিক K বার হয়:1
ব্যাখ্যা - পরিসরটি 10 থেকে 100 পর্যন্ত শুরু হয়। সুতরাং, ডিজিট অর্থাৎ 4 এর সাথে সম্ভাব্য সংখ্যা ঠিক k হয় অর্থাৎ 2 বার 44 এর মধ্যে তাই গণনা হল 1।
ইনপুট - int start =10, end =100, d =6 এবং m =1
আউটপুট - একটি পরিসরে সংখ্যার গণনা যেখানে d সংখ্যাটি ঠিক K বার হয়:1
ব্যাখ্যা - পরিসরটি 10 থেকে 100 পর্যন্ত শুরু হয়। সুতরাং, d সংখ্যার সাথে সম্ভাব্য সংখ্যাগুলি যথা 4 হয় ঠিক k অর্থাৎ 1 সময়টি 16, 26, 36, 46, 56, 76, 86 এবং 96 এর মধ্যে তাই গণনাটি 8। আমরা করব 66 কে বিবেচনা করবেন না কারণ 6 কে k বারের বেশি ঘটছে।
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
- ভেরিয়েবলের শুরু থেকে ভেরিয়েবল শেষ পর্যন্ত পূর্ণসংখ্যার একটি পরিসর তৈরি করুন এবং ভেরিয়েবল ডি এবং কে ঘোষণা করুন এবং মানগুলি ইনপুট করুন। আরও প্রক্রিয়াকরণের জন্য ফাংশনে ডেটা পাস করুন।
- ভেক্টর টাইপের একটি ভেরিয়েবল তৈরি করুন, আসুন vec বলি।
- স্টার্ট লুপ যতক্ষণ না ভ্যালু ভ্যারিয়েবল স্টার্টের ভিতরে থাকে। এখন, কিছুক্ষণের মধ্যে ভ্যাল % 10 হিসাবে মানটিকে ভেক্টরে পুশ করুন এবং val / 10 হিসাবে সেট করুন৷
- এসটিএল-এ রিভার্স ফাংশনকে কল করুন vec.begin() এবং vec.end() এর যুক্তি হিসেবে।
- মেমসেট ব্যবহার করে অ্যারের মানগুলি -1 হিসাবে সেট করুন।
- সেট_টোটাল (0, 0, 0, vec) ফেরত দিন যা এমন একটি ফাংশন যা পরীক্ষা করবে যে সংখ্যাগুলি d দিয়ে জোড় অবস্থান এবং m দ্বারা বিভাজ্য কিনা
- সেট_টোটাল ফাংশনের ভিতরে-:
- একটি ভেক্টরের আকারের সমান IF স্থানটি পরীক্ষা করুন তারপর IF temp =k তারপর 1 দিন বা 0 দিন।
- চেক করুন যদি arr[place][temp][val][rem] -1 এর সমান না হয় তারপর arr[place][temp][val][rem] এ মান ফেরত দিন।
- ফলাফল সংরক্ষণ করতে একটি পরিবর্তনশীল গণনা ঘোষণা করুন।
- একটি পরিবর্তনশীল temp_2 ঘোষণা করুন এবং এটিকে 9 IF val সমান 1 ELSE এ সেট করুন vec[place] দিয়ে।
- temp_2 পর্যন্ত i থেকে 0 পর্যন্ত লুপ শুরু করুন এবং IF i সমান d চেক করুন তারপর চেক করুন IF d নোটটি 0 এর সমান বা d হল 0 এবং rem =1 তারপর মোট 1 দ্বারা বৃদ্ধি করুন
- একটি ভেরিয়েবলকে temp_2 হিসাবে ঘোষণা করুন এবং এটিকে ভ্যালে সেট করুন
- যদি আমি vec[স্থান] এর চেয়ে কম তা পরীক্ষা করুন তারপর temp_2 কে 1 হিসাবে সেট করুন
- সেট_টোটাল ফাংশনে পুনরাবৃত্ত কলের সাথে গণনা সেট করুন
- রিটার্ন arr[place][temp][val] =গণনা।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
const int MAX = 20;
int arr[MAX][MAX][2][2];
int d, K;
int set_total(int place, int temp, int val, int rem, vector < int > vec) {
if (place == vec.size()) {
if (temp == K) {
return 1;
}
return 0;
}
if (arr[place][temp][val][rem] != -1) {
return arr[place][temp][val][rem];
}
int count = 0;
int temp_2 = (val ? 9 : vec[place]);
for (int i = 0; i <= temp_2; i++) {
int total = temp;
if (i == d) {
if (d != 0 || (!d && rem)) {
total++;
}
}
int total_2 = val;
if (i < vec[place]) {
total_2 = 1;
}
count += set_total(place + 1, total, total_2, rem || (i != 0), vec);
}
return arr[place][temp][val][rem] = count;
}
int occurrence_d(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, 0, vec);
}
int main() {
int start = 10;
int end = 100;
d = 4, K = 2;
int count = occurrence_d(end) - occurrence_d(start - 1);
cout << "Count of Numbers in a Range where digit d occurs exactly K times are: " << count;
return 0;
} যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −
উৎপন্ন করবেআউটপুট
Count of Numbers in a Range where digit d occurs exactly K times are: 1