Given a floating-point number in the form of a string N, the task is to convert the given floating-point number into fractions.
Enclosed sequence of digits in “()” in the floating-point representation expresses recurrence in the decimal representation.
For example, 1.(6) represents 1.666….
Examples:
Input: N = “1.5”
Output: 3 / 2
Explanation:
The value of 3 / 2 will be equal to 1.5Input: N = “1.(6)”
Output: 5 / 3
Explanation:
The value of 5 / 3 will be equal to 1.666… which is represented as 1.(6).
Approach: The idea is to use the Greatest Common Divisor of two numbers and some mathematical equations to solve the problem. Follow the below steps to solve the problem:
- Let there be x numbers after the decimal except for the recurring sequence.
- If there is no recurring sequence then multiply the given number with 10xand let the GCD of 10xand the resultant number be g. Print resultant divided by g as the numerator and 10xdivided by g as the denominator.
For example, if N = “1.5” then x = 1.
Multiplying N with 10, the resultant will be 15 and the GCD of 10 and 15 is 3.
Therefore, print 15/3 = 5 as the numerator and 10/5 as the denominator.
- If the recurrence sequence is present, then multiply N with 10x. For example, if N = 23.98(231) multiply it with N*(102).
- Let the total number of digits in a sequence be y. For 102*N = 2398.(231), y becomes 3.
- Multiply 10ywith N*10x. For 102*N = 2398.(231), multiply it with 103i.e., 102*N*103 = 2398231.(231).
- Now, subtract, N*10y+x with N*10x and let the result be M. For the above example, 102*N*(103-1) = 2395833.
- Therefore, N = M / ((10x)*(10y – 1)). For the above example, N = 2395833 / 999000.
- Find the GCD of M and ((10x)*(10y – 1)) and print M / gcd as the numerator and ((10x)*(10y – 1)) as the denominator.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to convert the floating // values into fraction void findFraction(string s)
{ // Initialize variables
string be_deci = "" ,
af_deci = "" ,
reccu = "" ;
bool x = true , y = false ,
z = false ;
// Traverse the floating string
for ( int i = 0; i < s.size(); ++i) {
// Check if decimal part exist
if (s[i] == '.' ) {
x = false ;
y = true ;
continue ;
}
// Check if recurrence
// sequence exist
if (s[i] == '(' ) {
z = true ;
y = false ;
continue ;
}
// Retrieve decimal part
// and recurrence re sequence
if (x)
be_deci += s[i];
if (y)
af_deci += s[i];
if (z) {
// Traverse the string
for (; i < s.size()
&& s[i] != ')' ;
++i)
reccu += s[i];
break ;
}
}
// Convert string to integer
int num_be_deci = stoi(be_deci);
int num_af_deci = 0;
// If no recurrence sequence exist
if (af_deci.size() != 0)
num_af_deci = stoi(af_deci);
// Initialize numerator & denominator
int numr = num_be_deci
* pow (10, af_deci.size())
+ num_af_deci;
int deno = pow (10, af_deci.size());
// No recurring term
if (reccu.size() == 0) {
int gd = __gcd(numr, deno);
// Print the result
cout << numr / gd << " / "
<< deno / gd;
}
// If recurring term exist
else {
// Convert recurring term to integer
int reccu_num = stoi(reccu);
// reccu.size() is num of
// digit in recur term
int numr1
= numr
* pow (10, reccu.size())
+ reccu_num;
int deno1 = deno
* pow (10, reccu.size());
// eq 2 - eq 1
int res_numr = numr1 - numr,
res_deno = deno1 - deno;
int gd = __gcd(res_numr,
res_deno);
// Print the result
cout << res_numr / gd << " / "
<< res_deno / gd;
}
} // Driver Code int main()
{ // Given string str
string str = "23.98(231)" ;
// Function Call
findFraction(str);
return 0;
} |
// Java program for the above approach import java.util.*;
class GFG{
// Recursive function to return // gcd of a and b static int __gcd( int a, int b)
{ return b == 0 ? a : __gcd(b, a % b);
} // Function to convert the floating // values into fraction static void findFraction(String s)
{ // Initialize variables
String be_deci = "" ,
af_deci = "" ,
reccu = "" ;
boolean x = true , y = false ,
z = false ;
// Traverse the floating String
for ( int i = 0 ; i < s.length(); ++i)
{
// Check if decimal part exist
if (s.charAt(i) == '.' )
{
x = false ;
y = true ;
continue ;
}
// Check if recurrence
// sequence exist
if (s.charAt(i) == '(' )
{
z = true ;
y = false ;
continue ;
}
// Retrieve decimal part
// and recurrence resquence
if (x)
be_deci += s.charAt(i);
if (y)
af_deci += s.charAt(i);
if (z)
{
// Traverse the String
for (; i < s.length() && s.charAt(i) != ')' ;
++i)
reccu += s.charAt(i);
break ;
}
}
// Convert String to integer
int num_be_deci = Integer.valueOf(be_deci);
int num_af_deci = 0 ;
// If no recurrence sequence exist
if (af_deci.length() != 0 )
num_af_deci = Integer.valueOf(af_deci);
// Initialize numerator & denominator
int numr = num_be_deci *
( int )Math.pow( 10 , af_deci.length()) +
num_af_deci;
int deno = ( int )Math.pow( 10 , af_deci.length());
// No recurring term
if (reccu.length() == 0 )
{
int gd = __gcd(numr, deno);
// Print the result
System.out.print(numr / gd + " / " +
deno / gd);
}
// If recurring term exist
else
{
// Convert recurring term to integer
int reccu_num = Integer.valueOf(reccu);
// reccu.size() is num of
// digit in recur term
int numr1 = numr *
( int )Math.pow( 10 , reccu.length()) +
reccu_num;
int deno1 = deno * ( int ) Math.pow(
10 , reccu.length());
// eq 2 - eq 1
int res_numr = numr1 - numr,
res_deno = deno1 - deno;
int gd = __gcd(res_numr,
res_deno);
// Print the result
System.out.print(res_numr / gd + " / " +
res_deno / gd);
}
} // Driver Code public static void main(String[] args)
{ // Given String str
String str = "23.98(231)" ;
// Function Call
findFraction(str);
} } // This code is contributed by Amit Katiyar |
# Python3 program for the above approach from math import gcd
# Function to convert the floating # values into fraction def findFraction(s):
# Initialize variables
be_deci = ""
af_deci = ""
reccu = ""
x = True
y = False
z = False
# Traverse the floating string
for i in range ( len (s)):
# Check if decimal part exist
if (s[i] = = '.' ):
x = False
y = True
continue
# Check if recurrence
# sequence exist
if (s[i] = = '(' ):
z = True
y = False
continue
# Retrieve decimal part
# and recurrence resquence
if (x):
be_deci + = s[i]
if (y):
af_deci + = s[i]
if (z):
# Traverse the string
while i < len (s) and s[i] ! = ')' :
reccu + = s[i]
i + = 1
break
# Convert to integer
num_be_deci = int (be_deci)
num_af_deci = 0
# If no recurrence sequence exist
if len (af_deci) ! = 0 :
num_af_deci = int (af_deci)
# Initialize numerator & denominator
numr = (num_be_deci *
pow ( 10 , len (af_deci)) +
num_af_deci)
deno = pow ( 10 , len (af_deci))
# No recurring term
if len (reccu) = = 0 :
gd = gcd(numr, deno)
# Print the result
print (numr / / gd, "/" , deno / / gd)
# If recurring term exist
else :
# Convert recurring term to integer
reccu_num = int (reccu)
# reccu.size() is num of
# digit in recur term
numr1 = (numr * pow ( 10 , len (reccu)) +
reccu_num)
deno1 = deno * pow ( 10 , len (reccu))
# eq 2 - eq 1
res_numr = numr1 - numr
res_deno = deno1 - deno
gd = gcd(res_numr, res_deno)
# Print the result
print (res_numr / / gd, " / " ,
res_deno / / gd)
# Driver Code if __name__ = = '__main__' :
# Given str
str = "23.98(231)"
# Function Call
findFraction( str )
# This code is contributed by mohit kumar 29 |
// C# program for the above approach using System;
class GFG{
// Recursive function to return // gcd of a and b static int __gcd( int a, int b)
{ return b == 0 ? a : __gcd(b, a % b);
} // Function to convert the floating // values into fraction static void findFraction(String s)
{ // Initialize variables
String be_deci = "" ,
af_deci = "" ,
reccu = "" ;
bool x = true , y = false ,
z = false ;
// Traverse the floating String
for ( int i = 0; i < s.Length; ++i)
{
// Check if decimal part exist
if (s[i] == '.' )
{
x = false ;
y = true ;
continue ;
}
// Check if recurrence
// sequence exist
if (s[i] == '(' )
{
z = true ;
y = false ;
continue ;
}
// Retrieve decimal part
// and recurrence resquence
if (x)
be_deci += s[i];
if (y)
af_deci += s[i];
if (z)
{
// Traverse the String
for (; i < s.Length && s[i] != ')' ;
++i)
reccu += s[i];
break ;
}
}
// Convert String to integer
int num_be_deci = Int32.Parse(be_deci);
int num_af_deci = 0;
// If no recurrence sequence exist
if (af_deci.Length != 0)
num_af_deci = Int32.Parse(af_deci);
// Initialize numerator & denominator
int numr = num_be_deci *
( int )Math.Pow(10, af_deci.Length) +
num_af_deci;
int deno = ( int )Math.Pow(10, af_deci.Length);
// No recurring term
if (reccu.Length == 0)
{
int gd = __gcd(numr, deno);
// Print the result
Console.Write(numr / gd + " / " +
deno / gd);
}
// If recurring term exist
else
{
// Convert recurring term to integer
int reccu_num = Int32.Parse(reccu);
// reccu.Count is num of
// digit in recur term
int numr1 = numr *
( int )Math.Pow(10, reccu.Length) +
reccu_num;
int deno1 = deno * ( int )Math.Pow(
10, reccu.Length);
// eq 2 - eq 1
int res_numr = numr1 - numr,
res_deno = deno1 - deno;
int gd = __gcd(res_numr,
res_deno);
// Print the result
Console.Write(res_numr / gd + " / " +
res_deno / gd);
}
} // Driver Code public static void Main(String[] args)
{ // Given String str
String str = "23.98(231)" ;
// Function Call
findFraction(str);
} } // This code is contributed by Amit Katiyar |
<script> // Javascript program for the above approach // Recursive function to return // gcd of a and b function __gcd(a,b)
{ return b == 0 ? a : __gcd(b, a % b);
} // Function to convert the floating // values into fraction function findFraction(s)
{ // Initialize variables
let be_deci = "" ,
af_deci = "" ,
reccu = "" ;
let x = true , y = false ,
z = false ;
// Traverse the floating String
for (let i = 0; i < s.length; ++i)
{
// Check if decimal part exist
if (s[i] == '.' )
{
x = false ;
y = true ;
continue ;
}
// Check if recurrence
// sequence exist
if (s[i] == '(' )
{
z = true ;
y = false ;
continue ;
}
// Retrieve decimal part
// and recurrence resquence
if (x)
be_deci += s[i];
if (y)
af_deci += s[i];
if (z)
{
// Traverse the String
for (; i < s.length && s[i] != ')' ; ++i)
reccu += s[i];
break ;
}
}
// Convert String to integer
let num_be_deci = parseInt(be_deci);
let num_af_deci = 0;
// If no recurrence sequence exist
if (af_deci.length != 0)
num_af_deci = parseInt(af_deci);
// Initialize numerator & denominator
let numr = num_be_deci *
Math.pow(10, af_deci.length) +
num_af_deci;
let deno = Math.pow(10, af_deci.length);
// No recurring term
if (reccu.length == 0)
{
let gd = __gcd(numr, deno);
// Print the result
document.write(numr / gd + " / " +
deno / gd);
}
// If recurring term exist
else
{
// Convert recurring term to integer
let reccu_num = parseInt(reccu);
// reccu.size() is num of
// digit in recur term
let numr1 = numr *
Math.pow(10, reccu.length) +
reccu_num;
let deno1 = deno * Math.pow(
10, reccu.length);
// eq 2 - eq 1
let res_numr = numr1 - numr,
res_deno = deno1 - deno;
let gd = __gcd(res_numr,
res_deno);
// Print the result
document.write(res_numr / gd + " / " +
res_deno / gd);
}
} // Driver Code // Given String str let str = "23.98(231)" ;
// Function Call findFraction(str); // This code is contributed by unknown2108 </script> |
798611 / 33300
Time Complexity: O(log10N)
Auxiliary Space: O(1)