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 <bits/stdc++.h> 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
<script> // Javascript 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 function findNumber(s, d)
{ // To store the final number
var num = [] ;
// To store the value that is evenly
// distributed among all the digits
var val = parseInt(s / d);
// To store the remaining sum that still
// remains to be distributed among d digits
var 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 ( var i = 1; i <= d - rem; i++)
{
// num = num.concat(toString(val));
num.push(val.toString());
}
// In the last rem digits one is added to
// the value obtained by equal distribution
if (rem != 0)
{
val++;
for ( var i = d - rem + 1; i <= d; i++)
{
// num = num + toString(val);
num.push(val.toString());
}
}
return num;
} var s = 25, d = 4;
var n=findNumber(s, d);
for ( var i = 0; i < n.length; i++)
{ document.write(n[i]);
} // This code is contributed by SoumikMondal </script> |
Output:
6667
Time Complexity: O(d)
Auxiliary Space: O(d)