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

C++ প্রোগ্রাম: কোন বেসে সংখ্যাকে প্রকাশ করলে M-র চেয়ে বড় হয় না তা গণনা

মান লিখুন: আমাদের কাছে একটি সাংখ্যিক স্ট্রিং S এবং আরেকটি সংখ্যা M রয়েছে। S-তে সবচেয়ে বড় অঙ্ক হল d। d+1 বা তার চেয়ে বড় কোনো পূর্ণসংখ্যা n বেছে নিলে S কে বেস-n সংখ্যা হিসেবে দেখলে কতগুলো ভিন্ন পূর্ণসংখ্যা (যে M-র চেয়ে বড় নয়) পাওয়া যায় তা বের করতে হবে।

উদাহরণ

যদি ইনপুট হয় S = "999"; M = 1500, তবে আউটপুট হবে 3, কারণ:
বেস ১০: 999
বেস ১১: 1197
বেস ১২: 1413
এই তিনটি মানই M-র চেয়ে বড় নয়।

সমাধানের ধাপসমূহ

যদি S.size() == 1:
    যদি S-এর মান <= M: 1 রিটার্ন করুন
    অন্যথায়: 0 রিটার্ন করুন
d := 0
S-এর প্রতিটি ক্যারেক্টার c এর জন্য:
    d := max(d, c - '0')
left := d, right := M + 1
যখন right - left > 1:
    mid := (left + right) / 2
    v := 0
    S-এর প্রতিটি ক্যারেক্টার c এর জন্য:
        যদি v > M / mid: v := M + 1
        অন্যথায়: v := v * mid + (c - '0')
    যদি v <= M: left := mid
    অন্যথায়: right := mid
left - d রিটার্ন করুন

C++ বাস্তবায়ন

#include <bits/stdc++.h>
using namespace std;

int solve(string S, int M) {
    if (S.size() == 1) {
        if (stoi(S) <= M) return 1;
        else return 0;
    }
    int d = 0;
    for (char c : S) d = max(d, int(c - '0'));
    long left = d, right = M + 1;
    while (right - left > 1) {
        long mid = (left + right) / 2;
        long v = 0;
        for (char c : S) {
            if (v > M / mid) v = M + 1;
            else v = v * mid + (c - '0');
        }
        if (v <= M) left = mid;
        else right = mid;
    }
    return left - d;
}

int main() {
    string S = "999";
    int M = 1500;
    cout << solve(S, M) << endl;
}

ইনপুট

"999", 1500

আউটপুট

3
  1. C++ প্রোগ্রাম: একটি সংখ্যা ২-এর পাওয়ার কিনা তা চেক করা

  2. C++ প্রোগ্রাম: একটি সংখ্যাকে নিজের চেয়ে ছোট সংখ্যাগুলোর যোগফল হিসেবে লিখার পদ্ধতির সংখ্যা বের করা

  3. C++ প্রোগ্রাম: স্ট্রিংয়ের পারমুটেশন সংখ্যা বের করা

  4. পাইথনে x এর চেয়ে বড় সর্বনিম্ন সংখ্যা কীভাবে খুঁজে বের করবেন?