আমাদেরকে একটি ভেরিয়েবল থেকে শুরু করে একটি পূর্ণসংখ্যা পরিসীমা দেওয়া হয়েছে, ধরা যাক ভেরিয়েবলের শেষ পর্যন্ত শুরু এবং একটি পরিবর্তনশীল 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