কম্পিউটার টিউটোরিয়াল

রেঞ্জে নির্দিষ্ট ডিজিট d ঠিক K বার থাকা সংখ্যার গণনা (C++)

একটি ইন্টিজার রেঞ্জ দেওয়া আছে start থেকে end পর্যন্ত এবং দুটি ভেরিয়েবল k ও d। কাজ হল রেঞ্জে এমন সংখ্যাগুলোর সংখ্যা বের করা যাতে ডিজিট d ঠিক k বার উপস্থিত থাকে।

উদাহরণ

ইনপুট - int start = 10, int end = 100, d = 4, K = 2

আউটপুট - রেঞ্জে ডিজিট d ঠিক K বার থাকা সংখ্যার সংখ্যা: 1

ব্যাখ্যা - রেঞ্জ ১০ থেকে ১০০। ডিজিট ৪ ঠিক ২ বার থাকা সংখ্যা শুধু ৪৪। তাই কাউন্ট ১।

ইনপুট - int start = 10, end = 100, d = 6, m = 1

আউটপুট - রেঞ্জে ডিজিট d ঠিক K বার থাকা সংখ্যার সংখ্যা: 1

ব্যাখ্যা - রেঞ্জ ১০ থেকে ১০০। ডিজিট ৬ ঠিক ১ বার থাকা সংখ্যাগুলো: ১৬, ২৬, ৩৬, ৪৬, ৫৬, ৭৬, ৮৬, ৯৬ (মোট ৮টি)। ৬৬ গণনা নয় কারণ ৬ দুইবার আছে।

প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • ইন্টিজার রেঞ্জ, d এবং k ইনপুট নিয়ে ফাংশনে পাস করুন।
  • একটি ভেক্টর vec ডিক্লেয়ার করুন।
  • হোয়াইল লুপে val (start-এর মান) এর ডিজিটগুলো vec-এ পুশ করুন (val%10), তারপর val/=10।
  • STL-র reverse ফাংশন দিয়ে ভেক্টর উল্টান।
  • অ্যারে -1 দিয়ে ইনিশিয়ালাইজ করুন (memset)।
  • set_total(0, 0, 0, vec) রিটার্ন করুন যা চেক করবে নম্বরগুলোর ইভেন পজিশনে d আছে কিনা এবং m দিয়ে বিভাজ্য কিনা।
  • set_total ফাংশনে:
    • যদি place == vec.size() হয় তবে temp == k হলে ১ রিটার্ন করুন অন্যথায় ০।
    • যদি arr[place][temp][val][rem] != -1 হয় তবে সেটি রিটার্ন করুন।
    • count ভেরিয়েবল ডিক্লেয়ার করুন।
    • temp_2 = (val ? 9 : vec[place])।
    • i=0 থেকে temp_2 পর্যন্ত লুপ: যদি i==d হয় তবে শর্ত অনুযায়ী total++।
    • রিকার্সিভ কল দিয়ে count আপডেট করুন।
    • arr[place][temp][val][rem] = count রিটার্ন করুন।

উদাহরণ কোড

#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
  1. C++-এ দেওয়া রেঞ্জে জোড় সংখ্যক বার আসা নাম্বাদের XOR

  2. C++-এ নির্দিষ্ট রেঞ্জে সবচেয়ে ছোট ফ্যাক্টর K হয় এমন সংখ্যা গণনা

  3. C++-এ ১ থেকে n পর্যন্ত ৪ ডিজিট থাকা সংখ্যা গণনা (Count Numbers with Digit 4)

  4. C++-এ d-ডিজিটের ধনাত্মক পূর্ণসংখ্যা যেগুলোতে ০ ডিজিট থাকে (Count d-digit Numbers with Digit 0)