Imprimeix tots els nombres d'n xifres la suma dels quals és igual a la suma donada
Un nombre donat de dígits n imprimeix tots els nombres d'n dígits la suma de dígits dels quals suma la suma donada. La solució no hauria de considerar els 0 inicials com a dígits.
Exemples:
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
C++
A solució senzilla seria generar tots els nombres de N dígits i imprimir nombres que tinguin la suma dels seus dígits igual a la suma donada. La complexitat d'aquesta solució seria exponencial.
Una millor solució és generar només aquells nombres de N dígits que compleixin les restriccions donades. La idea és utilitzar la recursivitat. Bàsicament omplim tots els dígits del 0 al 9 a la posició actual i mantenim la suma de dígits fins ara. Aleshores recurrem a la suma i el nombre de dígits restants. Tractem els 0 inicials per separat, ja que no es compten com a dígits.
A continuació es mostra una implementació recursiva senzilla de la idea anterior:
Java// A C++ recursive program to print all n-digit // numbers whose sum of digits equals to given sum #includeusing 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 ; } Python 3// 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 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 out index ): # 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 ] = '