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

C++ में दिए गए अंकों के योग के साथ संख्याएं (N से छोटी या उसके बराबर) गिनें

एक स्ट्रिंग स्ट्रिंग को देखते हुए जिसमें एक संख्या और इनपुट के रूप में कुल योग होता है। लक्ष्य str तक की संख्याओं को खोजना है जिनमें अंकों का योग योग के बराबर हो।

आइए उदाहरणों से समझते हैं।

उदाहरण के लिए

इनपुट - एन =”110” योग=5

आउटपुट - दिए गए अंकों के योग के साथ N से छोटी या उसके बराबर संख्याओं की संख्या हैं:7

स्पष्टीकरण - 110 तक की संख्याएँ जिनके अंकों का योग 5 के बराबर है, वे हैं :-

5, 14, 23, 32, 41, 50 और 104.

इनपुट - एन ="1000" योग =3

आउटपुट - दिए गए अंकों के योग के साथ N से छोटी या उसके बराबर संख्याओं की संख्या है:10

स्पष्टीकरण - 1000 तक की संख्याएँ जिनके अंकों का योग 3 के बराबर है, वे हैं :-

3, 12, 21, 30, 102, 111, 120, 201, 210 और 300.

नीचे दिए गए प्रोग्राम में इस्तेमाल किया गया तरीका इस प्रकार है

इस दृष्टिकोण में हम डायनामिक प्रोग्रामिंग का उपयोग संख्याओं के योग और उनके अंकों को एरे एरर [18] [2] [162] में स्टोर करने के लिए करेंगे। यहां 18 अधिकतम 18 अंकों की संख्या के लिए है, 2 मान 0 और 1 के लिए है। और 162 अधिकतम संभव योग के लिए है यदि सभी 18 अंक 9 ( 18*9=162 ) हैं।

तत्व arr का मान [i] [j] [k] उन संख्याओं की संख्या का प्रतिनिधित्व करता है जिनके पहले i अंकों को ध्यान में रखा जाता है और j 0 या 1 है जो इस बात पर आधारित है कि i अंक वर्तमान निर्मित संख्या पहले i अंक संख्या से कम या अधिक है। N. (यदि N 123 है और i 2 है तो हम जांच करेंगे कि 2 अंक संख्या बराबर हैं या 12 से अधिक हैं। यदि 12 के बराबर है तो j 1 होगा और j गिरफ्तारी में 0 होगा[i][j][k ] ) अनुक्रमणिका k, arr[i][j][k] में i अंकों का योग होगा।

अगर i=N के अंक और k=इनपुट योग तो परिणाम 1 और 0 होगा।

अगला अंक (i+1th) भरने के लिए हम j की जांच करेंगे। अगर j 1 है तो i-1 अंक N के i-1 अंकों के बराबर हैं, इसलिए अगले अंक में केवल 0 से i+1 के बीच का मान हो सकता है ताकि इसे <=N बनाया जा सके।

यदि j 0 है तो i-1 अंक संख्या N में i-1 अंक संख्या से कम है। इसलिए हम अगले अंक (i+1 th) स्थिति के लिए 0 से 9 के बीच कोई भी मान रख सकते हैं और यह अभी भी इससे कम होगा एन.

अंत में परिणाम को अंतिम गणना के रूप में लौटाएं।

  • एक संख्या N और अंकों के योग के रूप में कुल का प्रतिनिधित्व करने वाली स्ट्रिंग लें।
  • सरणी गिरफ्तार करें[18][2][162] और मेमसेट का उपयोग करके इसे -1 से प्रारंभ करें।
  • फ़ंक्शन काउंट_डिजिट्स (इंट आई, बूल चेक, इंट टेम्प, इंट टोटल, स्ट्रिंग स्ट्र, इंट साइज) पुनरावर्ती रूप से एआर भरता है [] [] [] और अंत में दिए गए के साथ एन से छोटी या उसके बराबर संख्याओं की गणना करता है अंकों का योग।
  • यदि अंकों की वर्तमान संख्या मैं एन के अंकों के बराबर है और वर्तमान योग अस्थायी इनपुट योग के बराबर है तो 1 और रिटर्न 0 लौटाएं।
  • गिनती लें =गिरफ्तार करें [i] [जांचें] [अस्थायी]। यदि यह -1 नहीं है तो परिणाम के रूप में वापसी की गणना करें।
  • अस्थायी चर चेक_2 (बूल) और temp_2 लें। (इंट) ।
  • फॉर लूप का उपयोग करके अंकों को 0 से 9 तक पार करें और तुलना करें कि क्या चेक 1 या 0 है। यदि 1 है तो वर्तमान अंक ch की तुलना str[i] से करें। अगर यह बड़ा है तो लूप को तोड़ दें (कुछ न करें)।
  • चेक_2 सेट करें =चेक करें || सीएच
  • temp_2 =temp + (ch - '0') को वर्तमान योग के रूप में सेट करें।
  • अंकों के योग की पुनरावर्ती गणना के लिए गणना करने के लिए count_digits(i + 1, check_2, temp_2, Total, str, size) जोड़ें।
  • अंत में परिणाम के रूप में वापसी की गणना करें।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int arr[18][2][162];
int count_digits(int i, bool check, int temp, int total, ing str, int size) {
   if (i == size) {
      if (temp == total) {
         return 1;
      } else {
         return 0;
      }
   }
   int count = arr[i][check][temp];
   if (count != -1) {
      return count;
   }
   count = 0;
   bool check_2;
   int temp_2;
   for (char ch = '0'; ch <= '9'; ch++) {
      if (!check) {
         if (ch > str[i]) {
            break;
         }
      }
      check_2 = check || ch < str[i];
      temp_2 = temp + (ch - '0');
      count += count_digits(i + 1, check_2, temp_2, total, str, size);
   }
   return count;
}
int main() {
   string str = "1101";
   int size = str.size();
   int total = 5;
   memset(arr, -1, sizeof(arr));
   cout << "Count of numbers smaller than or equal to N with given digit sum are: " << count_digits(0, 0, 0, total, str, size);
   return 0;
}

यदि हम उपरोक्त कोड चलाते हैं तो यह निम्न आउटपुट उत्पन्न करेगा -

आउटपुट

Count of numbers smaller than or equal to N with given digit sum are: 26

  1. C++ में दी गई संख्या से विभाज्य n अंकों की संख्या गिनें

    हमें दो तत्व दिए गए हैं मान लीजिए, d और num, कार्य d अंकों की संख्याओं को खोजना है जो संख्या से विभाज्य हैं। सरल शब्दों में मान लें कि हमने d में एक इनपुट 2 दिया है, तो हम पहले सभी 2-अंकीय संख्याएँ यानी 10-99 से खोजेंगे और फिर वे सभी संख्याएँ ज्ञात करेंगे जो संख्या से विभाज्य हैं। आइए उदाहरणों की

  1. C++ में दिए गए मान से छोटे या उसके बराबर सभी जंपिंग नंबर प्रिंट करें

    इस समस्या में, हमें एक नंबर n दिया जाता है और हमें n से छोटे या बराबर सभी जंपिंग नंबर प्रिंट करने होते हैं। जंपिंग नंबर वे संख्याएँ हैं जिनके आसन्न अंक केवल एक से भिन्न होते हैं। कुछ जंपिंग नंबर 4565, 98, 7 हैं। सभी सिंगल-डिजिट नंबर को जंपिंग नंबर माना जाता है। 235 एक कूदने वाली संख्या नहीं है। अब,

  1. न्यूनतम संख्याएं जो N से छोटी या उसके बराबर हों और C++ में योग S के साथ हों

    समस्या कथन 1 से N और एक संख्या S से N नंबर दिए गए हैं। कार्य S को देने के लिए योग की न्यूनतम संख्या को प्रिंट करना है उदाहरण यदि n =7 और s =10 तो न्यूनतम 2 संख्याएँ आवश्यक हैं (9, 1) (8, 2) (7, 3) (6, 4) एल्गोरिदम Answer can be calculated using below formula (S/N) + 1 if { S %N > 0} उदाहरण #inc