Givet antal cifre n udskrive alle n-cifrede tal, hvis sum af cifre summeres til en given sum. Løsningen bør ikke overveje førende 0'er som cifre.
Eksempler:
Input: N = 2 Sum = 3
Output: 12 21 30
Input: N = 3 Sum = 6
Output: 105 114 123 132 141 150 204
213 222 231 240 303 312 321
330 402 411 420 501 510 600
Input: N = 4 Sum = 3
Output: 1002 1011 1020 1101 1110 1200
2001 2010 2100 3000
python konvertere bytes til streng
EN enkel løsning ville være at generere alle N-cifrede tal og udskrive tal, der har summen af deres cifre lig med given sum. Kompleksiteten af denne løsning ville være eksponentiel.
En bedre løsning er kun at generere de N-cifrede tal, der opfylder de givne begrænsninger. Tanken er at bruge rekursion. Vi udfylder stort set alle cifre fra 0 til 9 i den nuværende position og opretholder summen af cifre indtil videre. Vi recurserer derefter for resterende sum og antal cifre tilbage. Vi håndterer førende 0'er separat, da de ikke tælles som cifre.
Nedenfor er en simpel rekursiv implementering af ovenstående idé -
// A C++ recursive program to print all n-digit // numbers whose sum of digits equals to given sum #include using namespace std; // Recursive function to print all n-digit numbers // whose sum of digits equals to given sum // n sum --> value of inputs // out --> output array // index --> index of next digit to be filled in // output array void findNDigitNumsUtil(int n int sum char* out int index) { // Base case if (index > n || sum < 0) return; // If number becomes N-digit if (index == n) { // if sum of its digits is equal to given sum // print it if(sum == 0) { out[index] = ' '; cout << out << ' '; } return; } // Traverse through every digit. Note that // here we're considering leading 0's as digits for (int i = 0; i <= 9; i++) { // append current digit to number out[index] = i + '0'; // recurse for next digit with reduced sum findNDigitNumsUtil(n sum - i out index + 1); } } // This is mainly a wrapper over findNDigitNumsUtil. // It explicitly handles leading digit void findNDigitNums(int n int sum) { // output array to store N-digit numbers char out[n + 1]; // fill 1st position by every digit from 1 to 9 and // calls findNDigitNumsUtil() for remaining positions for (int i = 1; i <= 9; i++) { out[0] = i + '0'; findNDigitNumsUtil(n sum - i out 1); } } // Driver program int main() { int n = 2 sum = 3; findNDigitNums(n sum); return 0; }
Java // Java recursive program to print all n-digit // numbers whose sum of digits equals to given sum import java.io.*; class GFG { // Recursive function to print all n-digit numbers // whose sum of digits equals to given sum // n sum --> value of inputs // out --> output array // index --> index of next digit to be // filled in output array static void findNDigitNumsUtil(int n int sum char out[] int index) { // Base case if (index > n || sum < 0) return; // If number becomes N-digit if (index == n) { // if sum of its digits is equal to given sum // print it if(sum == 0) { out[index] = ' ' ; System.out.print(out); System.out.print(' '); } return; } // Traverse through every digit. Note that // here we're considering leading 0's as digits for (int i = 0; i <= 9; i++) { // append current digit to number out[index] = (char)(i + '0'); // recurse for next digit with reduced sum findNDigitNumsUtil(n sum - i out index + 1); } } // This is mainly a wrapper over findNDigitNumsUtil. // It explicitly handles leading digit static void findNDigitNums(int n int sum) { // output array to store N-digit numbers char[] out = new char[n + 1]; // fill 1st position by every digit from 1 to 9 and // calls findNDigitNumsUtil() for remaining positions for (int i = 1; i <= 9; i++) { out[0] = (char)(i + '0'); findNDigitNumsUtil(n sum - i out 1); } } // driver program to test above function public static void main (String[] args) { int n = 2 sum = 3; findNDigitNums(n sum); } } // This code is contributed by Pramod Kumar
Python 3 # Python 3 recursive program to print # all n-digit numbers whose sum of # digits equals to given sum # Recursive function to print all # n-digit numbers whose sum of # digits equals to given sum # n sum --> value of inputs # out --> output array # index --> index of next digit to be # filled in output array def findNDigitNumsUtil(n sum outindex): # Base case if (index > n or sum < 0): return f = '' # If number becomes N-digit if (index == n): # if sum of its digits is equal # to given sum print it if(sum == 0): out[index] = '