Smallest number greater than or equal to N having sum of digits not exceeding S

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 = 2Output: 10Explanation: Sum of digits of 10 is 1, which is less than 2.
Input: N = 19, S = 3Output: 20Explanation: 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.
Check if the sum of digits of N does not exceed S, return N.Initialize a variable, say ans equal to the given integer N and k with 1 to store the powers of 10.There can be at most 10 digits in the integer range.Iterate from i = 0 to 8. At each iteration, calculate the last digit as (ans / k)%10.The sum to make the last digit 0 is k*((10-last_digit)%10). Add it to ans.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.
Check if the sum of digits of N does not exceed S, return N.
Initialize a variable, say ans equal to the given integer N and k with 1 to store the powers of 10.
There can be at most 10 digits in the integer range.
Iterate from i = 0 to 8. At each iteration, calculate the last digit as (ans / k)%10.
The sum to make the last digit 0 is k*((10-last_digit)%10). Add it to ans.
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++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to calculate sum// digits of nint 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 conditionint 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 Codeint main(){     // Given N and S    int N = 3, S = 2;     // Function call    cout << smallestNumber(N, S) << endl;     return 0;}
// Java program for the above approachimport java.io.*; class GFG{ // Function to calculate sum// digits of nstatic 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 conditionstatic 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 Codepublic 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
# Python program for the above approach # Function to calculate# sum of digits of ndef sum(n):    sm = 0    while(n > 0):        sm += n % 10        n //= 10    return sm # Function to find the smallest# possible integer satisfying the# given conditiondef 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 Sn, s = 3, 2 # Function callprint(smallestNumber(n, s))
// C# program for the above approachusing System; class GFG{ // Function to calculate sum// digits of nstatic 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 conditionstatic 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 Codepublic 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
<script>// javascript program for the above approach // Function to calculate sum// digits of nfunction sum(n){    var res = 0;    while (n > 0)    {        res += n % 10;        n /= 10;    }    return res;} // Function to find the smallest// possible integer satisfying the// given conditionfunction smallestNumber(n , s){         // If the sum of digits    // is already smaller than S    if (sum(n) <= s)    {        return n;    }     // Initialize variables    var ans = n, k = 1;     for(i = 0; i < 9; ++i)    {                 // Finding last kth digit        var digit = (ans / k) % 10;         // Add remaining to make digit 0        var 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 // Given N and Svar N = 3, S = 2; // Function calldocument.write(smallestNumber(N, S)); // This code is contributed by shikhasingrajput.</script>
10
 
Time Complexity: O(log210(N)) where N is the given integer.Space Complexity: O(1)
akhilsaini
shikhasingrajput
Discrete Mathematics
number-digits
number-theory
Numbers
python
Greedy
Mathematical
number-theory
Greedy
Mathematical
Numbers
python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Shortest Job First (or SJF) CPU Scheduling Non-preemptive algorithm using Segment Tree
Greedy Algorithm for Egyptian Fraction
Huffman Decoding
Bin Packing Problem (Minimize number of used Bins)
Boruvka's algorithm | Greedy Algo-9
Program for Fibonacci numbers
C++ Data Types
Set in C++ Standard Template Library (STL)
Operators in C / C++
Merge two sorted arrays