Last Updated on March 25, 2022 by Ria Pathak
CONCEPTS USED:
Recursion
DIFFICULTY LEVEL:
Hard
PROBLEM STATEMENT(
SIMPLIFIED)
:
Given a digit
N
and an integerSum
, print all theN
-digit integers whose digit sum is equal to the givenSum
.
See original problem statement here
For Example:
Input : N = 2, Sum = 8
Output : 17 26 35 44 53 62 71 80
Explanation : All these elements are valid 2 digit integers with sum of digits as 8.
Can we use Recursion
here ?
Of course, we need to find all combinations of
N
digits that sum up to a givenSum
. Such combinations can be easily generated usingRecursion
.
SOLVING APPROACH:
- The idea is to generate all
N
digits numbers recursively and print numbers whose sum of digits is equal to givenSum
.- Initialize an empty string
str = ""
.- Recursively append digits
(0-9)
tostr
and subtract digits fromSum
till the length ofstr
becomesN
.- If length of
str
becomesN
andSum
becomes0
, this implies that the stored number instr
is a valid number. Hence printstr
.
NOTE: One important observation is, leading 0
‘s must be
handled explicitly as they are not counted as digits.
ALGORITHM:
str = ""
NdigitNums (str, n, sum)
if (length of str becomes n and sum becomes 0)
print str
Run loop from d = '0' to '9'
NdigitNums (str+d, n-1, sum-d)
SOLUTIONS:
#include <stdio.h> #include <string.h> /* function for appending a char to a char array */ void append(char* s, char c) { int len = strlen(s); s[len] = c; s[len+1] = '\0'; } void findNdigitNums(char *res,int n,int sum){ if(n && sum >= 0){ char d = '0'; char empty[] = ""; if(strcmp(res, empty) == 0) d = '1'; for(;d <= '9';d++){ /* creating a temporary char array */ char str[10]; /* copying original char array to temp array */ strcpy(str, res); /* append char i to char array str */ append(str, d); findNdigitNums(str, n-1, sum - (d - '0')); } } else if(n==0 && sum==0){ printf("%s ", res); } } int main(){ int n,sum; scanf("%d %d", &n, &sum); char res[10] = ""; findNdigitNums(res, n, sum); return 0; }
#include <bits/stdc++.h> using namespace std; /* Function to find all N-digit numbers with sum of digits equal to sum in Bottom-up manner*/ void findNdigitNums(string res,int n,int sum){ if(n && sum >= 0){ char d = '0'; if(res == "") d = '1'; // special case - number can't start from 0 for(;d <= '9';d++){ /* consider every valid digit and put it in the current index and recur for next index*/ findNdigitNums(res + d,n-1,sum - (d - '0')); } } /* if number becomes N-digit and its sum of digits is equal to given sum, print it*/ else if(n==0 && sum==0){ cout<<res<<" "; } } int main(){ int n,sum;cin>>n>>sum; string res; findNdigitNums(res,n,sum); return 0; }
import java.util.*; import java.io.*; public class Main { /* Function to find all N-digit numbers with sum of digits equal to sum in Bottom-up manner*/ static void findNdigitNums(String res,int n,int sum){ if(n > 0 && sum >= 0){ char d = '0'; if(res == "") d = '1'; // special case - number can't start from 0 for(;d <= '9';d++){ /* consider every valid digit and put it in the current index and recur for next index*/ findNdigitNums(res + d,n-1,sum - (d - '0')); } } /* if number becomes N-digit and its sum of digits is equal to given sum, print it*/ else if(n==0 && sum==0){ System.out.print(res + " "); } } public static void main(String args[]) throws IOException { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int sum = sc.nextInt(); String res = ""; findNdigitNums(res,n,sum); } }
def findNdigitNums(res, n, sum): if(n and sum >= 0): for d in range(10): if(res == ""): if d == 0: continue findNdigitNums(res + str(d), n - 1, sum - d) elif(n == 0 and sum == 0): print(res, end = " ") n, sum = map(int, input().split()) res = "" findNdigitNums(res, n, sum)
[forminator_quiz id="719"]
This article tried to discuss Recursion. Hope this blog helps you understand and solve the problem. To practice more problems on Recursion you can check out MYCODE | Competitive Programming.