Imprima todos los números de n dígitos cuya suma de dígitos sea igual a la suma dada
Dado un número de dígitos n, imprime todos los números de n dígitos cuya suma de dígitos da la suma dada. La solución no debe considerar los ceros iniciales como dígitos.
Ejemplos:
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ón sencilla sería generar todos los números de N dígitos e imprimir números cuya suma de sus dígitos sea igual a la suma dada. La complejidad de esta solución sería exponencial.
Una mejor solución es generar solo aquellos números de N dígitos que satisfagan las restricciones dadas. La idea es utilizar la recursividad. Básicamente, completamos todos los dígitos del 0 al 9 en la posición actual y mantenemos la suma de los dígitos hasta el momento. Luego recurrimos a la suma restante y al número de dígitos restantes. Manejamos los ceros iniciales por separado, ya que no se cuentan como dígitos.
A continuación se muestra una implementación recursiva simple 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 ] = '