ধরা যাক ০ এবং ৯-এর মধ্যে 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