- Trending Categories
- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP

- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who

# Count numbers (smaller than or equal to N) with given digit sum in C++

Given a string str containing a number and a sum total as input. The goal is to find numbers upto str that have sum of digits equal to total.

## Let us understand with examples.

**For Example**

**Input -** N=”110” sum=5

**Output -** Count of numbers smaller than or equal to N with given digit sum are: 7

**Explanation -** The numbers upto 110 that have sum of digits equal to 5 are :-

5, 14, 23, 32, 41, 50 and 104.

**Input -** N=”1000” sum=3

**Output -** Count of numbers smaller than or equal to N with given digit sum are: 10

**Explanation -** The numbers upto 1000 that have sum of digits equal to 3 are :-

3, 12, 21, 30, 102, 111, 120, 201, 210 and 300.

## Approach used in the below program is as follows

In this approach we will use dynamic programming to store the sums of numbers and their digits in array arr[18][2][162]. Here 18 is for maximum 18 digit numbers, 2 is for values 0 and 1. And 162 is for maximum sum possible if all 18 digits are 9 ( 18*9=162 ).

Value of element arr[i][j][k] represents count of numbers whose first i digits are taken into consideration and j is 0 or 1 based on whether the i digit current constructed number is less or more than first i digit number in N. ( if N is 123 and i is 2 then we will check if 2 digit numbers are equal or more than 12. If equal to 12 then j will be 1 else j will be 0 in arr[i][j][k] ). The index k will be the sum of i digits in arr[i][j][k].

If i=digits of N and k=input sum then result will be 1 else 0.

For filling the next digit ( i+1th ) we will check j. If j is 1 then i-1 digits are equal to i-1 digits of N so the next digit can only have values between 0 to i+1 th digit of N to make it <= N.

If j is 0 then the i-1 digit number is less than i-1 digit number in N. So we can place any value between 0 to 9 for the next digit ( i+1 th ) position and it will still be less than N.

At the end return the result as a final count.

- Take string str representing a number N and total as sum of digits.
- Take array arr[18][2][162] and initialize it with -1 using memset.
- Function count_digits(int i, bool check, int temp, int total, string str, int size) recursively fills arr[][][] and at the end returns count of numbers smaller than or equal to N with a given digit sum.
- If the current number of digits i is equal to digits of N and current sum temp is equal to input sum total then return 1 else return 0.
- Take count = arr[i][check][temp]. If it is not -1 then return count as result.
- Take temporary variables check_2 ( bool ) and temp_2. (int ).
- Traverse digits 0 to 9 using for loop and compare if check is 1 or 0. If 1 then compare current digit ch with str[i]. If it is greater then break the loop ( do nothing ).
- Set check_2 = check || ch < str[i].
- Set temp_2 = temp + (ch - '0') as current sum.
- Add count_digits(i + 1, check_2, temp_2, total, str, size) to count for recursively calculating sum of digits.
- At the end return count as result.

## Example

#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; }

If we run the above code it will generate the following output −

## Output

Count of numbers smaller than or equal to N with given digit sum are: 26

- Related Questions & Answers
- Count of Binary Digit numbers smaller than N in C++
- Minimum numbers which is smaller than or equal to N and with sum S in C++
- Print all Jumping Numbers smaller than or equal to a given value in C++
- Euler’s Totient function for all numbers smaller than or equal to n in java
- Largest number less than N with digit sum greater than the digit sum of N in C++
- Count of n digit numbers whose sum of digits equals to given sum in C++
- Count numbers whose XOR with N is equal to OR with N in C++
- Largest number smaller than or equal to N divisible by K in C++
- Count elements smaller than or equal to x in a sorted matrix in C++
- Count n digit numbers divisible by given number in C++
- Find all factorial numbers less than or equal to n in C++
- Print all prime numbers less than or equal to N in C++
- Maximum sum subarray having sum less than or equal to given sums in C++
- Print all Semi-Prime Numbers less than or equal to N in C++
- Count numbers whose difference with N is equal to XOR with N in C++