求分数的最小公倍数问题。
1、最大公约数
求最大公约数可用辗转相除法。
__int64 gcd(__int64 a,__int64 b)
{
__int64 c = a%b;
while(c)
{
a = b;
b = c;
c = a % b;
}
return b;
}
2、最小公倍数
两个数的最小公倍数等于其乘积除以最大公约数。
__int64 lcm(__int64 a,__int64 b)
{
return a * b / gcd(a,b);
}
3、分数的最小公倍数
对于两个最简的分数 a / b, c / d 把他们两个的最小公倍数 x / y 也设为一个分数形式,那么这个 x 一定能够整除 a , c, y 一定能够被 b , d整除。那么要求得最小公倍数,那么肯定是分子尽量小,即 a , c 的最小公倍数, 分母尽量大, 即 b , d 的最大公约数。
求一组分数的最小公倍数的方法
(1) 先将各个分数化为a/b的形式(假分数 或真分数形式)
(2) 用各个分数的分母的最大公因数作所求最小公倍数的分母
(3) 用各个分数的分子的最小公倍数数作所求最小公倍数的分
(1) 先将各个分数化为a/b的形式(假分数 或真分数形式)
(2) 用各个分数的分母的最大公因数作所求最小公倍数的分母
(3) 用各个分数的分子的最小公倍数数作所求最小公倍数的分
#include <stdio.h>
__int64 gcd(__int64 a,__int64 b)
{
__int64 c = a%b;
while(c)
{
a = b;
b = c;
c = a % b;
}
return b;
}
__int64 lcm(__int64 a,__int64 b)
{
return a * b / gcd(a,b);
}
int main()
{
__int64 a,b,c,d,e,f;
int temp,i,T;
scanf("%d",&T);
for(i = 0;i < T;i++)
{
scanf("%I64d/%I64d",&a,&b);
scanf("%I64d/%I64d",&c,&d);
temp = gcd(a,b);
a /= temp;
b /= temp;
temp = gcd(c,d);
c /= temp;
d /= temp;
e = lcm(a,c);
f = gcd(b,d);
if(f == 1)
printf("%I64d\n", e);
else printf("%I64d/%I64d\n", e,f);
}
return 0;
}