Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ प्रोग्राम यह पता लगाने के लिए कि कितने आधारों में हम M . से बड़ी संख्या का प्रतिनिधित्व नहीं कर सकते हैं

मान लीजिए कि हमारे पास एक संख्यात्मक स्ट्रिंग S है, और एक अन्य संख्या M है। मान लें कि d S में सबसे बड़ा अंक है। हमें कई अलग-अलग पूर्णांकों में खोजना होगा जो M से अधिक नहीं हैं, एक पूर्णांक n चुनकर पाया जा सकता है जो d+1 से कम नहीं है और देखकर एस आधार-एन संख्या के रूप में?

तो, अगर इनपुट एस ="999" जैसा है; एम =1500, तो आउटपुट 3 होगा, क्योंकि एस आधार 10 संख्या के रूप में, हमें 999 मिलता है, आधार 11 संख्या के रूप में, हमें 1197 मिलता है, आधार 12 संख्या के रूप में, हमें 1413 मिलता है। ये तीन मान केवल वही हैं जो हम कर सकते हैं प्राप्त करें और 1500 से अधिक न हों।

कदम

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

if size of S is same as 1, then:
   if numeric value of S <= M, then:
      return 1
   Otherwise
      return 0
d := 0
for each character c in S, do
   d := maximum of d and (c - ASCII of '0')
left := d
right := M + 1
while right - left > 1, do:
   mid := (left + right) / 2
   v := 0
   for each character c in S, do
      if v > M / mid, then:
         v := M + 1
      Otherwise
         v := v * mid + (c - ASCII of '0')
   if v <= M, then:
      left := mid
   Otherwise
      right := mid
return left - d

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

#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;
   long 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++ प्रोग्राम

    इस कार्यक्रम में हम उन तरीकों की संख्या गिनेंगे जिनके द्वारा एक संख्या को स्वयं से छोटी संख्याओं के योग द्वारा निरूपित किया जा सकता है। यह प्रोग्राम दिए गए नंबरों के विभाजन की गणना करेगा। हम इनपुट के रूप में एक नंबर n लेते हैं, फिर एक नंबर से शुरू करते हुए एक बार में 1 को हटाकर इसे तोड़ते हैं। यदि न

  1. सी ++ प्रोग्राम किसी दिए गए स्ट्रिंग के क्रमपरिवर्तन की संख्या का पता लगाने के लिए

    हम एक स्ट्रिंग के पात्रों को अलग-अलग क्रम में व्यवस्थित कर सकते हैं। यहां हम देखेंगे कि हम कैसे गिन सकते हैं कि किसी दिए गए स्ट्रिंग से कितने क्रमपरिवर्तन बन सकते हैं। हम जानते हैं कि यदि एक स्ट्रिंग abc है। इसमें तीन वर्ण हैं; हम उन्हें 3 में व्यवस्थित कर सकते हैं! =6 अलग-अलग तरीके। तो n वर्णों वा

  1. पायथन में x से बड़ी सबसे छोटी संख्या कैसे ज्ञात करें?

    अंतर्निहित फ़ंक्शन ceil() सबसे छोटी संख्या देता है जो दी गई संख्या से बड़ी है >>> x=6.67 >>> import math >>> math.ceil(x) 7 >>> x=1.13 >>> math.ceil(x) 2 >>> x=5.78 >>> math.ceil(x) 6 >>> x=-5.78 >>> math.ceil(x) -5 ध्