Split the number into N parts such that difference between the smallest and the largest part is minimum
Last Updated :
20 Aug, 2022
Given two integers ‘X’ and ‘N’, the task is to split the integer ‘X’ into exactly ‘N’ parts such that:
X1 + X2 + X3 + … + Xn = X and the difference between the maximum and the minimum number from the sequence is minimized.
Print the sequence in the end, if the number cannot be divided into exactly ‘N’ parts then print ‘-1’ instead.
Examples:
Input: X = 5, N = 3
Output: 1 2 2
Divide 5 into 3 parts such that the difference between the largest and smallest integer among
them is as minimal as possible. So we divide 5 as 1 + 2 + 2.
Input: X = 25, N = 5
Output: 5 5 5 5 5
Approach: There is always a way of splitting the number if X >= N.
- If the number is being split into exactly ‘N’ parts then every part will have the value X/N and the remaining X%N part can be distributed among any X%N numbers.
- Thus, if X % N == 0 then the minimum difference will always be ‘0’ and the sequence will contain all equal numbers i.e. x/n.
- Else, the difference will be ‘1’ and the sequence will be X/N, X/N, …, (X/N)+1, (X/N)+1..
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
void split( int x, int n)
{
if (x < n)
cout<< "-1" << " " ;
else if (x % n == 0)
{
for ( int i=0;i<n;i++)
cout<<(x/n)<< " " ;
}
else
{
int zp = n - (x % n);
int pp = x/n;
for ( int i=0;i<n;i++)
{
if (i>= zp)
cout<<(pp + 1)<< " " ;
else
cout<<pp<< " " ;
}
}
}
int main()
{
int x = 5;
int n = 3;
split(x, n);
}
|
Java
class GFG{
static void split( int x, int n)
{
if (x < n)
System.out.print( "-1 " );
else if (x % n == 0 )
{
for ( int i= 0 ;i<n;i++)
System.out.print((x/n)+ " " );
}
else
{
int zp = n - (x % n);
int pp = x/n;
for ( int i= 0 ;i<n;i++)
{
if (i>= zp)
System.out.print((pp + 1 )+ " " );
else
System.out.print(pp+ " " );
}
}
}
public static void main(String[] args)
{
int x = 5 ;
int n = 3 ;
split(x, n);
}
}
|
Python3
def split(x, n):
if (x < n):
print ( - 1 )
elif (x % n = = 0 ):
for i in range (n):
print (x / / n, end = " " )
else :
zp = n - (x % n)
pp = x / / n
for i in range (n):
if (i> = zp):
print (pp + 1 , end = " " )
else :
print (pp, end = " " )
x = 5
n = 3
split(x, n)
|
C#
using System;
public class GFG{
static void split( int x, int n)
{
if (x < n)
Console.WriteLine( "-1 " );
else if (x % n == 0)
{
for ( int i=0;i<n;i++)
Console.Write((x/n)+ " " );
}
else
{
int zp = n - (x % n);
int pp = x/n;
for ( int i=0;i<n;i++)
{
if (i>= zp)
Console.Write((pp + 1)+ " " );
else
Console.Write(pp+ " " );
}
}
}
static public void Main (){
int x = 5;
int n = 3;
split(x, n);
}
}
|
PHP
<?php
function split( $x , $n )
{
if ( $x < $n )
echo (-1);
else if ( $x % $n == 0)
{
for ( $i = 0; $i < $n ; $i ++)
{
echo ( $x / $n );
echo ( " " );
}
}
else
{
$zp = $n - ( $x % $n );
$pp = $x / $n ;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $i >= $zp )
{
echo (int) $pp + 1;
echo ( " " );
}
else
{
echo (int) $pp ;
echo ( " " );
}
}
}
}
$x = 5;
$n = 3;
split( $x , $n );
?>
|
Javascript
<script>
function split(x, n)
{
if (x < n)
document.write( "-1 " );
else if (x % n == 0)
{
for (let i=0;i<n;i++)
document.write((x/n)+ " " );
}
else
{
let zp = n - (x % n);
let pp = Math.floor(x/n);
for (let i=0;i<n;i++)
{
if (i>= zp)
document.write((pp + 1)+ " " );
else
document.write(pp+ " " );
}
}
}
let x = 5;
let n = 3;
split(x, n);
</script>
|
Time Complexity: O(n), since there run loop from 0 to (n – 1).
Auxiliary Space: O(1), since no extra space has been taken.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...