 Open in App
Not now

# Find smallest number with given number of digits and sum of digits under given constraints

• Difficulty Level : Hard
• Last Updated : 21 Sep, 2022

Given two integers S and D, the task is to find the number having D number of digits and the sum of its digits as S such that the difference between the maximum and the minimum digit in the number is as minimum as possible. If multiple such numbers are possible, print the smallest number.
Examples:

Input: S = 25, D = 4
Output: 6667
The difference between maximum digit 7 and minimum digit 6 is 1.

Input: S = 27, D = 3
Output: 999

Approach:

• Finding smallest number for given number of digits and sum is already discussed in this article.
• In this article, the idea is to minimize the difference between the maximum and minimum digit in the required number. Therefore, the sum s should be evenly distributed among d digits.
• If the sum is evenly distributed then the difference can be at most 1. The difference is zero when sum s is divisible by d. In that case, each of the digits has the same value equal to s/d.
• The difference is one when sum s is not divisible by d. In that case, after each digit is assigned value s/d, s%d sum value is still left to be distributed.
• As the smallest number is required, this remaining value is evenly distributed among last s%d digits of the number, i.e., last s%d digits in the number are incremented by one.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `// Function to find the number having``// sum of digits as s and d number of``// digits such that the difference between``// the maximum and the minimum digit``// the minimum possible``string findNumber(``int` `s, ``int` `d)``{``    ``// To store the final number``    ``string num = ``""``;` `    ``// To store the value that is evenly``    ``// distributed among all the digits``    ``int` `val = s / d;` `    ``// To store the remaining sum that still``    ``// remains to be distributed among d digits``    ``int` `rem = s % d;` `    ``int` `i;` `    ``// rem stores the value that still remains``    ``// to be distributed``    ``// To keep the difference of digits minimum``    ``// last rem digits are incremented by 1``    ``for` `(i = 1; i <= d - rem; i++) {``        ``num = num + to_string(val);``    ``}` `    ``// In the last rem digits one is added to``    ``// the value obtained by equal distribution``    ``if` `(rem) {``        ``val++;``        ``for` `(i = d - rem + 1; i <= d; i++) {``            ``num = num + to_string(val);``        ``}``    ``}` `    ``return` `num;``}` `// Driver function``int` `main()``{``    ``int` `s = 25, d = 4;` `    ``cout << findNumber(s, d);` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``import` `java.util.*;` `class` `GFG``{` `// Function to find the number having``// sum of digits as s and d number of``// digits such that the difference between``// the maximum and the minimum digit``// the minimum possible``static` `String findNumber(``int` `s, ``int` `d)``{``    ``// To store the final number``    ``String num = ``""``;` `    ``// To store the value that is evenly``    ``// distributed among all the digits``    ``int` `val = s / d;` `    ``// To store the remaining sum that still``    ``// remains to be distributed among d digits``    ``int` `rem = s % d;` `    ``int` `i;` `    ``// rem stores the value that still remains``    ``// to be distributed``    ``// To keep the difference of digits minimum``    ``// last rem digits are incremented by 1``    ``for` `(i = ``1``; i <= d - rem; i++)``    ``{``        ``num = num + String.valueOf(val);``    ``}` `    ``// In the last rem digits one is added to``    ``// the value obtained by equal distribution``    ``if` `(rem > ``0``)``    ``{``        ``val++;``        ``for` `(i = d - rem + ``1``; i <= d; i++)``        ``{``            ``num = num + String.valueOf(val);``        ``}``    ``}``    ``return` `num;``}` `// Driver function``public` `static` `void` `main(String[] args)``{``    ``int` `s = ``25``, d = ``4``;` `    ``System.out.print(findNumber(s, d));``}``}` `// This code is contributed by 29AjayKumar`

## Python3

 `# Python3 implementation of the approach` `# Function to find the number having``# sum of digits as s and d number of``# digits such that the difference between``# the maximum and the minimum digit``# the minimum possible``def` `findNumber(s, d) :` `    ``# To store the final number``    ``num ``=` `""` `    ``# To store the value that is evenly``    ``# distributed among all the digits``    ``val ``=` `s ``/``/` `d` `    ``# To store the remaining sum that still``    ``# remains to be distributed among d digits``    ``rem ``=` `s ``%` `d` `    ``# rem stores the value that still remains``    ``# to be distributed``    ``# To keep the difference of digits minimum``    ``# last rem digits are incremented by 1``    ``for` `i ``in` `range``(``1``, d ``-` `rem ``+` `1``) :``        ``num ``=` `num ``+` `str``(val)` `    ``# In the last rem digits one is added to``    ``# the value obtained by equal distribution``    ``if` `(rem) :``        ``val ``+``=` `1``        ``for` `i ``in` `range``(d ``-` `rem ``+` `1``, d ``+` `1``) :``            ``num ``=` `num ``+` `str``(val)` `    ``return` `num` `# Driver function``if` `__name__ ``=``=` `"__main__"` `:` `    ``s ``=` `25``    ``d ``=` `4` `    ``print``(findNumber(s, d))` `# This code is contributed by AnkitRai01`

## C#

 `// C# implementation of the approach``using` `System;` `class` `GFG``{` `    ``// Function to find the number having``    ``// sum of digits as s and d number of``    ``// digits such that the difference between``    ``// the maximum and the minimum digit``    ``// the minimum possible``    ``static` `String findNumber(``int` `s, ``int` `d)``    ``{``        ``// To store the readonly number``        ``String num = ``""``;` `        ``// To store the value that is evenly``        ``// distributed among all the digits``        ``int` `val = s / d;` `        ``// To store the remaining sum that still``        ``// remains to be distributed among d digits``        ``int` `rem = s % d;` `        ``int` `i;` `        ``// rem stores the value that still remains``        ``// to be distributed``        ``// To keep the difference of digits minimum``        ``// last rem digits are incremented by 1``        ``for` `(i = 1; i <= d - rem; i++)``        ``{``            ``num = num + String.Join(``""``, val);``        ``}` `        ``// In the last rem digits one is added to``        ``// the value obtained by equal distribution``        ``if` `(rem > 0)``        ``{``            ``val++;``            ``for` `(i = d - rem + 1; i <= d; i++)``            ``{``                ``num = num + String.Join(``""``, val);``            ``}``        ``}``        ``return` `num;``    ``}` `    ``// Driver function``    ``public` `static` `void` `Main(String[] args)``    ``{``        ``int` `s = 25, d = 4;` `        ``Console.Write(findNumber(s, d));``    ``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Output:

`6667`

Time Complexity: O(d)
Auxiliary Space: O(d)

My Personal Notes arrow_drop_up