给定一个十进制数字N ,任务是将N转换为等效的不可约分数。
An irreducible fraction is a fraction in which numerator and denominator are co-primes i.e., they have no other common divisor other than 1.
例子:
Input: N = 4.50
Output: 9/2
Explanation:
9/2 in decimal is written as 4.5
Input: N = 0.75
Output: 3/4
Explanation:
3/4 in decimal is written as 0.75
方法:请按照以下步骤解决问题。
- 获取整数值和十进制数“ n”的小数部分。
- 假定精度值为10 9,以将小数的小数部分转换为整数等效值。
- 计算小数部分的积分当量的GCD和精度值。
- 通过将小数部分的积分等值除以GCD值来计算分子。通过将精度值除以GCD值来计算分母。
- 从获得的混合馏分中,将其转化为不合适的馏分。
For example N = 4.50, integral value = 4 and fractional part = 0.50
Consider precision value to be (109) that is precision value = 1000000000
Calculate GCD(0.50 * 109, 109) = 500000000
Calculate numerator = (0.50 * 10^9) / 500000000 = 1 and denominator = 10^9/ 500000000 = 2
Convert mixed fraction into improper fraction that is fraction = ((4 * 2) + 1) / 2 = 9/2
下面是上述方法的实现:
C++
// C++ program for above approach
#include
using namespace std;
// Recursive function to
// return GCD of a and b
long long gcd(long long a, long long b)
{
if (a == 0)
return b;
else if (b == 0)
return a;
if (a < b)
return gcd(a, b % a);
else
return gcd(b, a % b);
}
// Function to convert decimal to fraction
void decimalToFraction(double number)
{
// Fetch integral value of the decimal
double intVal = floor(number);
// Fetch fractional part of the decimal
double fVal = number - intVal;
// Consider precision value to
// convert fractional part to
// integral equivalent
const long pVal = 1000000000;
// Calculate GCD of integral
// equivalent of fractional
// part and precision value
long long gcdVal
= gcd(round(fVal * pVal), pVal);
// Calculate num and deno
long long num
= round(fVal * pVal) / gcdVal;
long long deno = pVal / gcdVal;
// Print the fraction
cout << (intVal * deno) + num
<< "/" << deno << endl;
}
// Driver Code
int main()
{
double N = 4.5;
decimalToFraction(N);
return 0;
}
C
// C implementation of the above approach
#include
#include
int gcfFinder(int a, int b)
{ // gcf finder
int gcf = 1;
for (int i = 1; i <= a && i <= b; i++)
{
if (a % i == 0 && b % i == 0)
{
gcf = i;
}
}
return gcf;
}
int shortform(int* a, int* b)
{
for (int i = 2; i <= *a && i <= *b; i++)
{
if (*a % i == 0 && *b % i == 0)
{
*a = *a / i;
*b = *b / i;
}
}
return 0;
}
// Driver Code
int main(void)
{
// converting decimal into fraction.
double a = 4.50;
int c = 10000;
double b = (a - floor(a)) * c;
int d = (int)floor(a) * c + (int)(b + .5f);
while (1)
{
if (d % 10 == 0)
{
d = d / 10;
c = c / 10;
}
else
break;
}
int* i = &d;
int* j = &c;
int t = 0;
while (t != 1)
{
int gcf = gcfFinder(d, c);
if (gcf == 1)
{
printf("%d/%d\n", d, c);
t = 1;
}
else
{
shortform(i, j);
}
}
return 0;
}
// this code is contributed by harsh sinha username-
// harshsinha03
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Recursive function to
// return GCD of a and b
static long gcd(long a, long b)
{
if (a == 0)
return b;
else if (b == 0)
return a;
if (a < b)
return gcd(a, b % a);
else
return gcd(b, a % b);
}
// Function to convert decimal to fraction
static void decimalToFraction(double number)
{
// Fetch integral value of the decimal
double intVal = Math.floor(number);
// Fetch fractional part of the decimal
double fVal = number - intVal;
// Consider precision value to
// convert fractional part to
// integral equivalent
final long pVal = 1000000000;
// Calculate GCD of integral
// equivalent of fractional
// part and precision value
long gcdVal = gcd(Math.round(
fVal * pVal), pVal);
// Calculate num and deno
long num = Math.round(fVal * pVal) / gcdVal;
long deno = pVal / gcdVal;
// Print the fraction
System.out.println((long)(intVal * deno) +
num + "/" + deno);
}
// Driver Code
public static void main(String s[])
{
double N = 4.5;
decimalToFraction(N);
}
}
// This code is contributed by rutvik_56
Python3
# Python3 program for the above approach
from math import floor
# Recursive function to
# return GCD of a and b
def gcd(a, b):
if (a == 0):
return b
elif (b == 0):
return a
if (a < b):
return gcd(a, b % a)
else:
return gcd(b, a % b)
# Function to convert decimal to fraction
def decimalToFraction(number):
# Fetch integral value of the decimal
intVal = floor(number)
# Fetch fractional part of the decimal
fVal = number - intVal
# Consider precision value to
# convert fractional part to
# integral equivalent
pVal = 1000000000
# Calculate GCD of integral
# equivalent of fractional
# part and precision value
gcdVal = gcd(round(fVal * pVal), pVal)
# Calculate num and deno
num= round(fVal * pVal) // gcdVal
deno = pVal // gcdVal
# Print the fraction
print((intVal * deno) + num, "/", deno)
# Driver Code
if __name__ == '__main__':
N = 4.5
decimalToFraction(N)
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
class GFG{
// Recursive function to
// return GCD of a and b
static long gcd(long a, long b)
{
if (a == 0)
return b;
else if (b == 0)
return a;
if (a < b)
return gcd(a, b % a);
else
return gcd(b, a % b);
}
// Function to convert decimal to fraction
static void decimalToFraction(double number)
{
// Fetch integral value of the decimal
double intVal = Math.Floor(number);
// Fetch fractional part of the decimal
double fVal = number - intVal;
// Consider precision value to
// convert fractional part to
// integral equivalent
long pVal = 1000000000;
// Calculate GCD of integral
// equivalent of fractional
// part and precision value
long gcdVal = gcd((long)Math.Round(
fVal * pVal), pVal);
// Calculate num and deno
long num = (long)Math.Round(fVal * pVal) / gcdVal;
long deno = pVal / gcdVal;
// Print the fraction
Console.WriteLine((long)(intVal * deno) +
num + "/" + deno);
}
// Driver Code
public static void Main(String []s)
{
double N = 4.5;
decimalToFraction(N);
}
}
// This code is contributed by PrinciRaj1992
9/2
时间复杂度: O(log min(a,b))
辅助空间: O(1)