Find the Largest number with given number of digits and sum of digits

23 Jun, 2022
How to find the largest number with given digit sum s and number of digits d?Examples:  
Input  : s = 9, d = 2
Output : 90

Input  : s = 20, d = 3
Output : 992
 
A Simple Solution is to consider all m digit numbers and keep track of maximum number with digit sum as s. A close upper bound on time complexity of this solution is O(10m).There is a Greedy approach to solve the problem. The idea is to one by one fill all digits from leftmost to rightmost (or from most significant digit to least significant). We compare the remaining sum with 9 if the remaining sum is more than 9, we put 9 at the current position, else we put the remaining sum. Since we fill digits from left to right, we put the highest digits on the left side, hence get the largest number. Below image is an illustration of the above approach:  
Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find the largest number that can be// formed from given sum of digits and number of digits.#include <iostream>using namespace std; // Prints the smallest possible number with digit sum 's'// and 'm' number of digits.void findLargest(int m, int s){    // If sum of digits is 0, then a number is possible    // only if number of digits is 1.    if (s == 0)    {        (m == 1)? cout << "Largest number is " << 0                       : cout << "Not possible";        return ;    }     // Sum greater than the maximum possible sum.    if (s > 9*m)    {        cout << "Not possible";        return ;    }     // Create an array to store digits of result    int res[m];     // Fill from most significant digit to least    // significant digit.    for (int i=0; i<m; i++)    {        // Fill 9 first to make the number largest        if (s >= 9)        {            res[i] = 9;            s -= 9;        }         // If remaining sum becomes less than 9, then        // fill the remaining sum        else        {            res[i] = s;            s = 0;        }    }     cout << "Largest number is ";    for (int i=0; i<m; i++)        cout << res[i];} // Driver codeint main(){    int s = 9, m = 2;    findLargest(m, s);    return 0;}
// Java program to find the largest number that can be// formed from given sum of digits and number of digits class GFG{    // Function to print the largest possible number with digit sum 's'    // and 'm' number of digits    static void findLargest(int m, int s)    {        // If sum of digits is 0, then a number is possible        // only if number of digits is 1        if (s == 0)        {            System.out.print(m == 1 ? "Largest number is 0" : "Not possible");                         return ;        }          // Sum greater than the maximum possible sum        if (s > 9*m)        {            System.out.println("Not possible");            return ;        }          // Create an array to store digits of result        int[] res = new int[m];          // Fill from most significant digit to least        // significant digit        for (int i=0; i<m; i++)        {            // Fill 9 first to make the number largest            if (s >= 9)            {                res[i] = 9;                s -= 9;            }              // If remaining sum becomes less than 9, then            // fill the remaining sum            else            {                res[i] = s;                s = 0;            }        }          System.out.print("Largest number is ");        for (int i=0; i<m; i++)            System.out.print(res[i]);    }         // driver program    public static void main (String[] args)    {        int s = 9, m = 2;        findLargest(m, s);    }} // Contributed by Pramod Kumar
# Python 3 program to find# the largest number that# can be formed from given# sum of digits and number# of digits.  # Prints the smallest# possible number with digit# sum 's' and 'm' number of# digits.def findLargest( m, s) :     # If sum of digits is 0,    # then a number is possible    # only if number of digits    # is 1.    if (s == 0) :             if(m == 1) :            print("Largest number is " , "0",end = "")        else :            print("Not possible",end = "")             return     # Sum greater than the    # maximum possible sum.    if (s > 9 * m) :        print("Not possible",end = "")        return         # Create an array to    # store digits of    # result    res = [0] * m     # Fill from most significant    # digit to least significant    # digit.    for i in range(0, m) :                 # Fill 9 first to make        # the number largest        if (s >= 9) :            res[i] = 9            s = s - 9                 # If remaining sum        # becomes less than        # 9, then fill the        # remaining sum        else :            res[i] = s            s = 0                      print( "Largest number is ",end = "")         for i in range(0, m) :        print(res[i],end = "") # Driver codes = 9m = 2findLargest(m, s) # This code is contributed by Nikita Tiwari.
// C# program to find the// largest number that can// be formed from given sum// of digits and number of digitsusing System; class GFG{         // Function to print the     // largest possible number    // with digit sum 's' and    // 'm' number of digits    static void findLargest(int m, int s)    {        // If sum of digits is 0,        // then a number is possible        // only if number of digits is 1        if (s == 0)        {            Console.Write(m == 1 ?                   "Largest number is 0" :                          "Not possible");                         return ;        }         // Sum greater than the        // maximum possible sum        if (s > 9 * m)        {            Console.WriteLine("Not possible");            return ;        }         // Create an array to        // store digits of result        int []res = new int[m];         // Fill from most significant        // digit to least significant digit        for (int i = 0; i < m; i++)        {            // Fill 9 first to make            // the number largest            if (s >= 9)            {                res[i] = 9;                s -= 9;            }             // If remaining sum becomes            // less than 9, then            // fill the remaining sum            else            {                res[i] = s;                s = 0;            }        }         Console.Write("Largest number is ");        for (int i = 0; i < m; i++)            Console.Write(res[i]);    }         // Driver Code    static public void Main ()    {        int s = 9, m = 2;        findLargest(m, s);    }} // This code is Contributed by ajit
<?php// PHP program to find the largest// number that can be formed from// given sum of digits and number// of digits. // Prints the smallest possible// number with digit sum 's'// and 'm' number of digits.function findLargest($m, $s){    // If sum of digits is 0, then    // a number is possible only if    // number of digits is 1.    if ($s == 0)    {        if(($m == 1) == true)            echo "Largest number is " , 0;        else            echo "Not possible";        return ;    }     // Sum greater than the    // maximum possible sum.    if ($s > 9 * $m)    {        echo "Not possible";        return ;    }     // Create an array to store    // digits of result Fill from    // most significant digit to    // least significant digit.    for ($i = 0; $i < $m; $i++)    {        // Fill 9 first to make        // the number largest        if ($s >= 9)        {            $res[$i] = 9;            $s -= 9;        }         // If remaining sum becomes        // less than 9, then fill        // the remaining sum        else        {            $res[$i] = $s;            $s = 0;        }    }     echo "Largest number is ";    for ($i = 0; $i < $m; $i++)        echo $res[$i];} // Driver code$s = 9; $m = 2;findLargest($m, $s); // This code is contributed by m_kit?>
<script>// Javascript program to find the largest number that can be// formed from given sum of digits and number of digits. // Prints the smallest possible number with digit sum 's'// and 'm' number of digits.function findLargest(m, s){    // If sum of digits is 0, then a number is possible    // only if number of digits is 1.    if (s == 0)    {        (m == 1)? document.write("Largest number is " + 0)                    : document.write("Not possible");        return ;    }     // Sum greater than the maximum possible sum.    if (s > 9*m)    {        document.write("Not possible");        return ;    }     // Create an array to store digits of result    let res = new Array(m);     // Fill from most significant digit to least    // significant digit.    for (let i=0; i<m; i++)    {        // Fill 9 first to make the number largest        if (s >= 9)        {            res[i] = 9;            s -= 9;        }         // If remaining sum becomes less than 9, then        // fill the remaining sum        else        {            res[i] = s;            s = 0;        }    }     document.write("Largest number is ");    for (let i=0; i<m; i++)        document.write(res[i]);} // Driver code    let s = 9, m = 2;    findLargest(m, s); // This code is contributed by Mayank Tyagi </script>
Output : 
Largest number is 90
Time Complexity of this solution is O(m).
Auxiliary Space : O(m), where m is the given integer.
This article is contributed by Vaibhav Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article and mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
jit_t
mayanktyagi1709
AshokJaiswal
simmytarika5
tamanna17122007
number-digits
Greedy
Mathematical
Greedy
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Huffman Coding | Greedy Algo-3
Activity Selection Problem | Greedy Algo-1
Fractional Knapsack Problem
Job Sequencing Problem
Policemen catch thieves
Set in C++ Standard Template Library (STL)
C++ Data Types
Merge two sorted arrays
Operators in C / C++
Sieve of Eratosthenes