Skip to content
Related Articles
Smallest number greater than or equal to N having sum of digits not exceeding S
• Last Updated : 13 Apr, 2021

Given integer N and integer S, the task is to find the smallest number greater than or equal to N such that the sum of its digits does not exceed S.

Examples:

Input: N = 3, S = 2
Output: 10
Explanation: Sum of digits of 10 is 1, which is less than 2.

Input: N = 19, S = 3
Output: 20
Explanation: Sum of digits of 20 is 2, which is less than 3.

Approach: The problem can be solved using a greedy approach. Follow the below steps to solve the problem.

1. Check if the sum of digits of N does not exceed S, return N.
2. Initialize a variable, say ans equal to the given integer N and k with 1 to store the powers of 10.
3. There can be at most 10 digits in the integer range.
4. Iterate from i = 0 to 8. At each iteration, calculate the last digit as (ans / k)%10.
5. The sum to make the last digit 0 is k*((10-last_digit)%10). Add it to ans.
6. Check the sum of digits of ans. If it does not exceed S, print ans and break. Otherwise, update k as k = k*10 and repeat the above steps.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to calculate sum``// digits of n``int` `sum(``int` `n)``{``    ``int` `res = 0;``    ``while` `(n > 0) {``        ``res += n % 10;``        ``n /= 10;``    ``}``    ``return` `res;``}` `// Function to find the smallest``// possible integer satisfying the``// given condition``int` `smallestNumber(``int` `n, ``int` `s)``{``    ``// If the sum of digits``    ``// is already smaller than S``    ``if` `(sum(n) <= s) {``        ``return` `n;``    ``}` `    ``// Initialize variables``    ``int` `ans = n, k = 1;` `    ``for` `(``int` `i = 0; i < 9; ++i) {` `        ``// Finding last kth digit``        ``int` `digit = (ans / k) % 10;` `        ``// Add remaining to make digit 0``        ``int` `add = k * ((10 - digit) % 10);` `        ``ans += add;` `        ``// If sum of digits``        ``// does not exceed S``        ``if` `(sum(ans) <= s) {``            ``break``;``        ``}` `        ``// Update k``        ``k *= 10;``    ``}``    ``return` `ans;``}` `// Driver Code``int` `main()``{` `    ``// Given N and S``    ``int` `N = 3, S = 2;` `    ``// Function call``    ``cout << smallestNumber(N, S) << endl;` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.io.*;` `class` `GFG{` `// Function to calculate sum``// digits of n``static` `int` `sum(``int` `n)``{``    ``int` `res = ``0``;``    ``while` `(n > ``0``)``    ``{``        ``res += n % ``10``;``        ``n /= ``10``;``    ``}``    ``return` `res;``}` `// Function to find the smallest``// possible integer satisfying the``// given condition``static` `int` `smallestNumber(``int` `n, ``int` `s)``{``    ` `    ``// If the sum of digits``    ``// is already smaller than S``    ``if` `(sum(n) <= s)``    ``{``        ``return` `n;``    ``}` `    ``// Initialize variables``    ``int` `ans = n, k = ``1``;` `    ``for``(``int` `i = ``0``; i < ``9``; ++i)``    ``{``        ` `        ``// Finding last kth digit``        ``int` `digit = (ans / k) % ``10``;` `        ``// Add remaining to make digit 0``        ``int` `add = k * ((``10` `- digit) % ``10``);` `        ``ans += add;` `        ``// If sum of digits``        ``// does not exceed S``        ``if` `(sum(ans) <= s)``        ``{``            ``break``;``        ``}` `        ``// Update k``        ``k *= ``10``;``    ``}``    ``return` `ans;``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ` `    ``// Given N and S``    ``int` `N = ``3``, S = ``2``;` `    ``// Function call``    ``System.out.println(smallestNumber(N, S));``}``}` `// This code is contributed by akhilsaini`

## Python3

 `# Python program for the above approach` `# Function to calculate``# sum of digits of n``def` `sum``(n):``    ``sm ``=` `0``    ``while``(n > ``0``):``        ``sm ``+``=` `n ``%` `10``        ``n ``/``/``=` `10``    ``return` `sm` `# Function to find the smallest``# possible integer satisfying the``# given condition``def` `smallestNumber(n, s):` `# If sum of digits is``# already smaller than s``    ``if``(``sum``(n) <``=` `s):``        ``return` `n` `# Initialize variables``    ``ans, k ``=` `n, ``1` `    ``for` `i ``in` `range``(``9``):` `# Find the k-th digit``        ``digit ``=` `(ans ``/``/` `k) ``%` `10` `# Add remaining``        ``add ``=` `k ``*` `((``10` `-` `digit) ``%` `10``)` `        ``ans ``+``=` `add` `# If sum of digits``# does not exceed s``        ``if``(``sum``(ans) <``=` `s):``            ``break` `# Update K``        ``k ``*``=` `10` `# Return answer``    ``return` `ans` `# Driver Code` `# Given N and S``n, s ``=` `3``, ``2` `# Function call``print``(smallestNumber(n, s))`

## C#

 `// C# program for the above approach``using` `System;` `class` `GFG{` `// Function to calculate sum``// digits of n``static` `int` `sum(``int` `n)``{``    ``int` `res = 0;``    ``while` `(n > 0)``    ``{``        ``res += n % 10;``        ``n /= 10;``    ``}``    ``return` `res;``}` `// Function to find the smallest``// possible integer satisfying the``// given condition``static` `int` `smallestNumber(``int` `n, ``int` `s)``{``    ` `    ``// If the sum of digits``    ``// is already smaller than S``    ``if` `(sum(n) <= s)``    ``{``        ``return` `n;``    ``}` `    ``// Initialize variables``    ``int` `ans = n, k = 1;` `    ``for``(``int` `i = 0; i < 9; ++i)``    ``{``        ` `        ``// Finding last kth digit``        ``int` `digit = (ans / k) % 10;` `        ``// Add remaining to make digit 0``        ``int` `add = k * ((10 - digit) % 10);` `        ``ans += add;` `        ``// If sum of digits``        ``// does not exceed S``        ``if` `(sum(ans) <= s)``        ``{``            ``break``;``        ``}``        ` `        ``// Update k``        ``k *= 10;``    ``}``    ``return` `ans;``}` `// Driver Code``public` `static` `void` `Main()``{``    ` `    ``// Given N and S``    ``int` `N = 3, S = 2;` `    ``// Function call``    ``Console.WriteLine(smallestNumber(N, S));``}``}` `// This code is contributed by akhilsaini`

## Javascript

 ``
Output:
`10`

Time Complexity: O(log210(N)) where N is the given integer.
Space Complexity: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up