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

রেঞ্জে ডিজিট কাউন্ট


ধরা যাক ০ এবং ৯-এর মধ্যে d একটি পূর্ণসংখ্যা, আমাদের দুটি ধনাত্মক পূর্ণসংখ্যা low এবং high আছে নিম্ন ও উপরের সীমা হিসেবে। আমাদের d কতবার একটি ডিজিট হিসেবে low এবং high-এর মধ্যে থাকা সব পূর্ণসংখ্যাতে ঘটেছে (বাউন্ডস low এবং high ইনক্লুড করে) সেটি খুঁজে বের করতে হবে।

তাই, যদি ইনপুট d = 1, low = 1, high = 13 হয়, তবে আউটপুট হবে ৬, কারণ d=1 ডিজিটটি ৬বার ঘটেছে যেন 1, 10, 11, 12, 13-এ।

এটি সমাধান করতে, আমরা নিচের ধাপগুলো অনুসরণ করব -

একটি zero() ফাংশন ডিফাইন করুন, এটি n নেবে,

  • ret := 0, x := 0

  • যদি n, ০-এর সমান হয়, তবে -

    • 1 রিটার্ন করুন

  • m := 1 থেকে শুরু করুন, যখন m <= n, m := m * 10 করে আপডেট করুন, করুন -

    • a := n / m

    • b := n mod m

    • z := a mod 10

    • যদি m-এর ডিজিট সংখ্যা, n-এর ডিজিট সংখ্যার সমান হয়, তবে -

      • লুপ থেকে বের হোন

    • যদি z > x, তবে -

      • ret := ret + ((a / 10) + 1)

    • অন্যথায় যখন z, x-এর সমান, তবে

      • ret := ret + ((a / 10) * m + (b + 1))

    • অন্যথায়

      • ret := ret + (a / 10)

  • ret রিটার্ন করুন

  • একটি f() ফাংশন ডিফাইন করুন, এটি x, n নেবে,

  • ret := 0

  • m := 1 থেকে শুরু করুন, যখন m <= n, m := m * 10 করে আপডেট করুন, করুন -

    • a := n / m

    • b := n mod m

    • z := a mod 10

    • যদি z > x, তবে

      • ret := ret + ((a / 10) + 1)

    • অন্যথায় যখন z, x-এর সমান, তবে -

      • ret := ret + ((a / 10) * m + (b + 1))

    • অন্যথায়

      • ret := ret + (a / 10)

    • যদি x, ০-এর সমান হয়, তবে -

      • ret := ret - m

  • ret রিটার্ন করুন

  • মূল মেথড থেকে নিচের কাজগুলো করুন

  • ret রিটার্ন করুন

  • f(d, high) - f(d, low - 1) রিটার্ন করুন

বेहतर বোঝার জন্য নিচের বাস্তবায়নটি দেখুন -

উদাহরণ

#include <bits/stdc++.h> using namespace std; class Solution {    public:    int digitCount(int x){       int ret = 0;       while (x) {          ret++;          x /= 10;       }       return ret;    }    int zero(int n){       int ret = 0;       int x = 0;       if (n == 0)       return 1;       for (int m = 1; m <= n; m *= 10) {          int a = n / m;          int b = n % m;          int z = a % 10;          if (digitCount(m) == digitCount(n))          break;          if (z > x) {             ret += ((a / 10) + 1) * m;          }          else if (z == x) {             ret += (a / 10) * m + (b + 1);          } else {             ret += (a / 10) * m;          }          cout << ret << endl;       }       return ret;    }    int f(int x, int n){       int ret = 0;       for (int m = 1; m <= n; m *= 10) {          int a = n / m;          int b = n % m;          int z = a % 10;          if (z > x) {             ret += ((a / 10) + 1) * m;          }          else if (z == x) {             ret += (a / 10) * m + (b + 1);          } else {             ret += (a / 10) * m;          }          if (x == 0) {             ret -= m;          }       }       return ret;    }    int digitsCount(int d, int low, int high){       return f(d, high) - f(d, low - 1);    } }; main(){    Solution ob;    cout << (ob.digitsCount(1,1,13)); }

ইনপুট

1,1,13

আউটপুট

6

  1. C++-এ নির্দিষ্ট রেঞ্জে ফ্যাক্টোরিয়াল সংখ্যা গণনা

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

  3. পাইথনে একটি সংখ্যার নির্দিষ্ট রেঞ্জের সেট বিট (Set Bits) গণনা

  4. পাইথনে নির্দিষ্ট বিট পরিসরের অনসেট বিট গণনা করার প্রোগ্রাম