题目描述
给定两个分数,求其最小公倍数。用最简分数表示(整数就输出整数)。
输入
2
26501/6335 18468/42
29359/11479 15725/19170
输出
81570078/7
5431415
思路 求两个分数的最小公倍数,应先把两个分式化成最简形式,然后对两分子取最小公倍数作分子,对两分母取最大公因数作分母,这样的分数就是两个分数的最小公倍数。其中用到著名的辗转相除法,也叫欧几里得算法 求最大公因数gcd,最小公倍数lcm也可以用其相应表示。
/*
求两个分式的最小公倍数,先将两个分式化到最简,
然后两个分子的最小公倍数作分子,两个分母的最大公约数作分母
,即为两分式的最小公倍数
*/
#include <cstdio>
int gcd(int a, int b) //辗转相除法求最大公约数
{
return b==0 ? a:gcd(b,a%b);
}
int lcm(int a, int b)
{
return a/gcd(a,b)*b;//最小公倍数即为a*b/gcd(a,b) 为了避免爆int,先除后乘
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int x1,x2,y1,y2;
scanf("%d/%d %d/%d",&x1,&y1,&x2,&y2);
//x1/y1 x2/y2化到最简
int t = gcd(x1,y1);
x1 /= t;
y1 /= t;
t = gcd(x2,y2);
x2 /= t;
y2 /= t;
if(gcd(y1,y2) == 1) printf("%d\n",lcm(x1,x2));//若是整数输出整数
else printf("%d/%d\n",lcm(x1,x2),gcd(y1,y2));
}
return 0;
}