Smallest number greater than Y with sum of digits equal to X - GeeksforGeeks

10 Jun, 2021
Given two integers X and Y, find the minimal number with the sum of digits X, which is strictly greater than Y.
Examples: 
Input: X = 18, Y = 99 Output: 189 Explanation: 189 is the smallest number greater than 99 having sum of digits = 18.
Input: X = 12, Y = 72 Output: 75 Explanation: 75 is the smallest number greater than 72 that has sum of digits = 12. 
Naive Approach: The naive approach is iterate from Y + 1 and check if any number whose sum of digits is X or not. If we found any such number then print that number.
Time Complexity: O((R – Y)*log10N), where R is the maximum number till where we iterate and N is the number in the range [Y, R] Auxiliary Space: O(1)
Efficient Approach: The idea is to iterate through the digits of Y from right to left, and try to increase the current digit and change the digits to the right in order to make the sum of digits equal to X. Below are the steps: 
If we are considering the (k + 1)th digit from the right and increasing it, then it is possible to make the sum of k least significant digits to be any number in the range [0, 9k].
When such a position is found, then stop the process and print the number at that iteration.
If k least significant digits have sum M (where 0 ≤ M ≤ 9k), then obtain the answer greedily: Traverse from the right to the left and insert 9 and subtract 9 from the sum of digits.Once, the sum is less than 9, place the remaining sum.
Traverse from the right to the left and insert 9 and subtract 9 from the sum of digits.
Once, the sum is less than 9, place the remaining sum.
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 return the minimum string// of length d having the sum of digits sstring helper(int d, int s){     // Return a string of length d    string ans(d, '0');     for (int i = d - 1; i >= 0; i--) {         // Greedily put 9's in the end        if (s >= 9) {            ans[i] = '9';            s -= 9;        }         // Put remaining sum        else {            char c = (char)s + '0';            ans[i] = c;            s = 0;        }    }     return ans;} // Function to find the smallest// number greater than Y// whose sum of digits is Xstring findMin(int x, int Y){     // Convert number y to string    string y = to_string(Y);     int n = y.size();    vector<int> p(n);     // Maintain prefix sum of digits    for (int i = 0; i < n; i++) {        p[i] = y[i] - '0';        if (i > 0)            p[i] += p[i - 1];    }     // Iterate over Y from the back where    // k is current length of suffix    for (int i = n - 1, k = 0;; i--, k++) {         // Stores current digit        int d = 0;         if (i >= 0)            d = y[i] - '0';         // Increase current digit        for (int j = d + 1; j <= 9; j++) {             // Sum upto current prefix            int r = (i > 0) * p[i - 1] + j;             // Return answer if remaining            // sum can be obtained in suffix            if (x - r >= 0 and x - r <= 9 * k) {                 // Find suffix of length k                // having sum of digits x-r                string suf = helper(k, x - r);                 string pre = "";                if (i > 0)                    pre = y.substr(0, i);                 // Append current character                char cur = (char)j + '0';                pre += cur;                 // Return the result                return pre + suf;            }        }    }} // Driver Codeint main(){    // Given Number and Sum    int x = 18;    int y = 99;     // Function Call    cout << findMin(x, y) << endl;    return 0;}
// Java program for the above approachimport java.util.*; @SuppressWarnings("unchecked")class GFG{  // Function to return the minimum String// of length d having the sum of digits sstatic String helper(int d, int s){         // Return a String of length d    StringBuilder ans = new StringBuilder();          for(int i = 0; i < d; i++)    {        ans.append("0");    }          for(int i = d - 1; i >= 0; i--)    {                 // Greedily put 9's in the end        if (s >= 9)        {            ans.setCharAt(i,'9');            s -= 9;        }                  // Put remaining sum        else        {            char c = (char)(s + (int)'0');            ans.setCharAt(i,  c);            s = 0;        }    }    return ans.toString();}  // Function to find the smallest// number greater than Y// whose sum of digits is Xstatic String findMin(int x, int Y){         // Convert number y to String    String y = Integer.toString(Y);          int n = y.length();          ArrayList p = new ArrayList();          for(int i = 0; i < n; i++)    {        p.add(0);    }          // Maintain prefix sum of digits    for(int i = 0; i < n; i++)    {        p.add(i, (int)((int) y.charAt(i) - (int)'0'));                  if (i > 0)        {            p.add(i, (int)p.get(i) +                     (int)p.get(i - 1));        }    }          // Iterate over Y from the back where    // k is current length of suffix    for(int i = n - 1, k = 0;; i--, k++)    {                  // Stores current digit        int d = 0;                  if (i >= 0)        {            d = (int) y.charAt(i) - (int)'0';        }                  // Increase current digit        for(int j = d + 1; j <= 9; j++)        {            int r = j;                          // Sum upto current prefix            if (i > 0)            {                r += (int) p.get(i - 1);            }                          // Return answer if remaining            // sum can be obtained in suffix            if (x - r >= 0 && x - r <= 9 * k)            {                                  // Find suffix of length k                // having sum of digits x-r                String suf = helper(k, x - r);                                  String pre = "";                                  if (i > 0)                    pre = y.substring(0, i);                                  // Append current character                char cur = (char)(j + (int)'0');                pre += cur;                                  // Return the result                return pre + suf;            }        }    }}  // Driver codepublic static void main(String[] arg){         // Given number and sum    int x = 18;    int y = 99;          // Function call    System.out.print(findMin(x, y));}} // This code is contributed by pratham76
# Python3 program for the# above approach # Function to return the# minimum string of length# d having the sum of digits sdef helper(d, s):     # Return a string of    # length d    ans = ['0'] * d     for i in range(d - 1,                   -1, -1):         # Greedily put 9's        # in the end        if (s >= 9):            ans[i] = '9'            s -= 9         # Put remaining sum        else:            c = chr(s +                    ord('0'))            ans[i] = c;            s = 0;     return ''.join(ans); # Function to find the# smallest number greater# than Y whose sum of# digits is Xdef findMin(x, Y):     # Convert number y    # to string    y = str(Y);    n = len(y)    p = [0] * n     # Maintain prefix sum    # of digits    for i in range(n):        p[i] = (ord(y[i]) -                ord('0'))        if (i > 0):            p[i] += p[i - 1];     # Iterate over Y from the    # back where k is current    # length of suffix    n - 1    k = 0         while True:         # Stores current digit        d = 0;        if (i >= 0):            d = (ord(y[i]) -                 ord('0'))         # Increase current        # digit        for j in range(d + 1,                       10):             # Sum upto current            # prefix            r = ((i > 0) *                 p[i - 1] + j);             # Return answer if            # remaining sum can            # be obtained in suffix            if (x - r >= 0 and                x - r <= 9 * k):                 # Find suffix of length                # k having sum of digits                # x-r                suf = helper(k,                             x - r);                 pre = "";                if (i > 0):                    pre = y[0 : i]                 # Append current                # character                cur = chr(j +                          ord('0'))                pre += cur;                 # Return the result                return pre + suf;         i -= 1        k += 1      # Driver Codeif __name__ == "__main__":                  # Given Number and Sum    x = 18;    y = 99;     # Function Call    print ( findMin(x, y)) # This code is contributed by Chitranayal
// C# program for the above approachusing System;using System.Text;using System.Collections; class GFG{ // Function to return the minimum string// of length d having the sum of digits sstatic string helper(int d, int s){     // Return a string of length d    StringBuilder ans = new StringBuilder();         for(int i = 0; i < d; i++)    {        ans.Append("0");    }         for(int i = d - 1; i >= 0; i--)    {                 // Greedily put 9's in the end        if (s >= 9)        {            ans[i] = '9';            s -= 9;        }                 // Put remaining sum        else        {            char c = (char)(s + (int)'0');            ans[i] = c;            s = 0;        }    }    return ans.ToString();} // Function to find the smallest// number greater than Y// whose sum of digits is Xstatic string findMin(int x, int Y){         // Convert number y to string    string y = Y.ToString();         int n = y.Length;         ArrayList p = new ArrayList();         for(int i = 0; i < n; i++)    {        p.Add(0);    }         // Maintain prefix sum of digits    for(int i = 0; i < n; i++)    {        p[i] = (int)((int) y[i] - (int)'0');                 if (i > 0)        {            p[i] = (int)p[i] +                   (int)p[i - 1];        }    }         // Iterate over Y from the back where    // k is current length of suffix    for(int i = n - 1, k = 0;; i--, k++)    {                 // Stores current digit        int d = 0;                 if (i >= 0)        {            d = (int) y[i] - (int)'0';        }                 // Increase current digit        for(int j = d + 1; j <= 9; j++)        {            int r = j;                         // Sum upto current prefix            if (i > 0)            {                r += (int) p[i - 1];            }                         // Return answer if remaining            // sum can be obtained in suffix            if (x - r >= 0 && x - r <= 9 * k)            {                                 // Find suffix of length k                // having sum of digits x-r                string suf = helper(k, x - r);                                 string pre = "";                                 if (i > 0)                    pre = y.Substring(0, i);                                 // Append current character                char cur = (char)(j + (int)'0');                pre += cur;                                 // Return the result                return pre + suf;            }        }    }} // Driver codepublic static void Main(string[] arg){         // Given number and sum    int x = 18;    int y = 99;         // Function call    Console.Write(findMin(x, y));}} // This code is contributed by rutvik_56
<script> // Javascript program for the above approach // Function to return the minimum String// of length d having the sum of digits sfunction helper(d, s){         // Return a String of length d    let ans = [];           for(let i = 0; i < d; i++)    {        ans.push("0");    }           for(let i = d - 1; i >= 0; i--)    {                 // Greedily put 9's in the end        if (s >= 9)        {            ans[i] ='9';            s -= 9;        }                   // Put remaining sum        else        {            let c = String.fromCharCode(                s + '0'.charCodeAt(0));            ans[i] = c;            s = 0;        }    }    return ans.join("");} // Function to find the smallest// number greater than Y// whose sum of digits is Xfunction findMin(x, Y){         // Convert number y to String    let y = Y.toString();    let n = y.length;    let p = [];           for(let i = 0; i < n; i++)    {        p.push(0);    }           // Maintain prefix sum of digits    for(let i = 0; i < n; i++)    {        p[i] = y[i].charCodeAt(0) -                '0'.charCodeAt(0);                   if (i > 0)        {            p[i] = p[i] + p[i - 1];        }    }           // Iterate over Y from the back where    // k is current length of suffix    for(let i = n - 1, k = 0;; i--, k++)    {                 // Stores current digit        let d = 0;                   if (i >= 0)        {            d =  y[i].charCodeAt(0) -                  '0'.charCodeAt(0);        }                   // Increase current digit        for(let j = d + 1; j <= 9; j++)        {            let r = j;                           // Sum upto current prefix            if (i > 0)            {                r +=  p[i - 1];            }                           // Return answer if remaining            // sum can be obtained in suffix            if (x - r >= 0 && x - r <= 9 * k)            {                                   // Find suffix of length k                // having sum of digits x-r                let suf = helper(k, x - r);                let pre = "";                                   if (i > 0)                    pre = y.substring(0, i);                                   // Append current character                let cur = String.fromCharCode(                    j + '0'.charCodeAt(0));                pre += cur;                                   // Return the result                return pre + suf;            }        }    }} // Driver code // Given number and sumlet x = 18;let y = 99; // Function calldocument.write(findMin(x, y));   // This code is contributed by avanitrachhadiya2155 </script>
189
 
Time Complexity: O(log10Y) Auxiliary Space: O(log10Y) 
rutvik_56
ukasp
pratham76
avanitrachhadiya2155
number-digits
school-programming
Algorithms
Competitive Programming
Greedy
Mathematical
School Programming
Strings
Strings
Greedy
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
How to Start Learning DSA?
Understanding Time Complexity with Simple Examples
How to write a Pseudo Code?
Competitive Programming - A Complete Guide
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Prefix Sum Array - Implementation and Applications in Competitive Programming
Top 10 Algorithms and Data Structures for Competitive Programming