C ++で指定された桁の合計で数値(N以下)をカウントします
入力として数値と合計を含む文字列strが与えられます。目標は、桁の合計が合計に等しいstrまでの数値を見つけることです。
例を挙げて理解しましょう。
例
入力- N =” 110” sum =5
出力- 与えられた桁の合計でN以下の数の数は次のとおりです:7
説明- 桁の合計が5に等しい110までの数字は次のとおりです:-
5、14、23、32、41、50、104。
入力- N =” 1000” sum =3
出力- 与えられた桁の合計でN以下の数の数は次のとおりです:10
説明- 桁の合計が3に等しい1000までの数は:-
3、12、21、30、102、111、120、201、210、300。
以下のプログラムで使用されているアプローチは次のとおりです
このアプローチでは、動的計画法を使用して、数値とその桁の合計を配列arr [18][2][162]に格納します。ここで、18は最大18桁の数値、2は値0および1を表し、162は18桁すべてが9(18 * 9 =162)の場合に可能な最大合計を表します。
要素の値arr[i][j] [k]は、最初のi桁が考慮され、jが0または1である数のカウントを表します。 N.(Nが123でiが2の場合、2桁の数字が12以上であるかどうかを確認します。12に等しい場合、jは1になります。それ以外の場合、arr [i][j][kでjは0になります。 ])。インデックスkは、arr [i][j][k]のi桁の合計になります。
i =Nの桁、k =入力合計の場合、結果は1、それ以外の場合は0になります。
次の桁(i + 1番目)を埋めるために、jをチェックします。 jが1の場合、i-1桁はNのi-1桁に等しいため、次の桁はNの0〜i+1番目の桁の値のみを使用して<=Nにすることができます。
jが0の場合、i-1桁の数値はNのi-1桁の数値よりも小さくなります。したがって、次の桁(i + 1番目)の位置に0から9までの任意の値を配置できますが、それでも以下になります。 N。
最後に、結果を最終カウントとして返します。
- 数値Nを表す文字列strを取得し、合計を桁の合計として取得します。
- 配列arr[18][2] [162]を取得し、memsetを使用して-1で初期化します。
- 関数count_digits(int i、bool check、int temp、int total、string str、int size)は、arr [] [] []を再帰的に埋め、最後に、指定されたN以下の数値のカウントを返します。数字の合計。
- 現在の桁数iがNの桁に等しく、現在の合計温度が入力合計合計に等しい場合は1を返し、それ以外の場合は0を返します。
- Take count =arr [i][check][temp]。 -1でない場合は、結果としてカウントを返します。
- 一時変数check_2(bool)とtemp_2を取得します。 (int)。
- forループを使用して0から9までの数字をトラバースし、チェックが1か0かを比較します。1の場合、現在の数字chをstr[i]と比較します。それより大きい場合は、ループを解除します(何もしません)。
- check_2=チェックを設定|| ch
- 現在の合計として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
-
C++で指定された値以下のすべてのジャンプ番号を出力します
この問題では、数値nが与えられ、n以下のすべてのジャンプ数値を出力する必要があります。 ジャンプ番号 隣接する桁が1つだけ異なる番号です。一部のジャンプ番号は4565、98、7です。すべての1桁の番号は、ジャンプ番号と見なされます。 235はジャンプ番号ではありません。 では、問題を理解するために例を見てみましょう Input: N = 32 Output: 0 1 2 3 4 5 6 7 8 9 10 12 21 23 32 この問題を解決するために、0が開始ノードであるグラフを想定し、到達可能なすべてのノードにトラバースします。 BFSを使用してトラバースできます またはDFS 。こ
-
N以下で、C++の合計がSである最小数
問題の説明 1からNまでのN個の数とS個の数が与えられます。タスクは、合計して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} 例 #include <bits/stdc++.h> using namespace std; int getMinNumbers(int n, int s) { r