Given two positive integers N and D representing a fraction as N/D, the task is to split the fraction into the sum of multiple fractions having numerator as 1.
Examples:
Input: n = 4, d = 5
Output: 1/2, 1/4, 1/20
Explanation: 1/2 + 1/4 + 1/20 = 4/5Input: n = 15, d = 16
Output: 1/2, 1/3, 1/10, 1/240
Approach: The idea is that all positive fractions of the form n/d can be written as a sum of distinct unit fractions. The answer can be found by removing largest unit fraction 1/x till the fraction reaches to zero where x can be found as ceil(d/n). After finding the unit fraction, update the fraction to n/d – 1/x so n changes to nx-d and d changes to dx at each step.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to split the fraction into // distinct unit fraction vector<string> FractionSplit( long long n, long long d)
{ // To store answer
vector<string> UnitFactions;
// While numerator is positive
while (n > 0) {
// Finding x = ceil(d/n)
long long x = (d + n - 1) / n;
// Add 1/x to list of ans
string s = "1/" + to_string(x);
UnitFactions.push_back(s);
// Update fraction
n = n * x - d;
d = d * x;
}
return UnitFactions;
} // Driver Code int main()
{ // Given Input
long long n = 13, d = 18;
// Function Call
auto res = FractionSplit(n, d);
// Print Answer
for (string s : res)
cout << s << ", " ;
return 0;
} |
// Java program for the above approach import java.util.Vector;
public class GFG {
// Function to split the fraction into
// distinct unit fraction
static Vector<String> FractionSplit( long n, long d)
{
// To store answer
Vector<String> UnitFactions = new Vector<>();
// While numerator is positive
while (n > 0 ) {
// Finding x = ceil(d/n)
long x = (d + n - 1 ) / n;
// Add 1/x to list of ans
String s = "1/" + String.valueOf(x);
UnitFactions.add(s);
// Update fraction
n = n * x - d;
d = d * x;
}
return UnitFactions;
}
// Driver code
public static void main(String[] args)
{
// Given Input
long n = 13 , d = 18 ;
// Function Call
Vector<String> res = FractionSplit(n, d);
// Print Answer
for (String s : res)
System.out.print(s + ", " );
}
} // This code is contributed by abhinavjain194 |
# Python program for the above approach # Function to split the fraction into # distinct unit fraction def FractionSplit(n, d):
# To store answer
UnitFactions = []
# While numerator is positive
while (n > 0 ):
# Finding x = ceil(d/n)
x = (d + n - 1 ) / / n
# Add 1/x to list of ans
s = "1/" + str (x)
UnitFactions.append(s);
# Update fraction
n = n * x - d;
d = d * x
return UnitFactions;
# Driver Code # Given Input n = 13 ;
d = 18 ;
# Function Call res = FractionSplit(n, d);
# Print Answer for s in res:
print (s + ", " , end = " " );
# This code is contributed by _saurabh_jaiswal |
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
// Function to split the fraction into // distinct unit fraction static List< string > FractionSplit( long n, long d)
{ // To store answer
List< string > UnitFactions = new List< string >();
// While numerator is positive
while (n > 0)
{
// Finding x = ceil(d/n)
long x = (d + n - 1) / n;
// Add 1/x to list of ans
string s = "1/" + x.ToString();
UnitFactions.Add(s);
// Update fraction
n = n * x - d;
d = d * x;
}
return UnitFactions;
} // Driver code public static void Main( string [] args)
{ // Given Input
long n = 13, d = 18;
// Function Call
List< string > res = FractionSplit(n, d);
// Print Answer
foreach ( string s in res)
Console.Write(s + ", " );
} } // This code is contributed by ukasp |
<script> // Javascript program for the above approach // Function to split the fraction into // distinct unit fraction function FractionSplit(n, d) {
// To store answer
let UnitFactions = [];
// While numerator is positive
while (n > 0) {
// Finding x = ceil(d/n)
let x = Math.floor((d + n - 1) / n);
// Add 1/x to list of ans
let s = "1/" + String(x);
UnitFactions.push(s);
// Update fraction
n = n * x - d;
d = d * x;
}
return UnitFactions;
} // Driver Code // Given Input let n = 13, d = 18; // Function Call let res = FractionSplit(n, d); // Print Answer for (let s of res)
document.write(s + ", " );
// This code is contributed by gfgking. </script> |
1/2, 1/5, 1/45,
Time Complexity: O(1)
Auxiliary Space: O(1)