【问题描述】
有一面很长很长的墙。你需要在这面墙上贴上两行瓷砖。你的手头有两种不同尺寸的瓷
砖,你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度
为 A/B ,贴在第二行的每块瓷砖长度为C/D.
两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙是对齐的。你想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。
【输入】
输入的第 1 行包含一个正整数 T,表示测试数据的组数。
接下来 T 行,每行 4 个正整数 A,B,C,D,表示该组测试数据中,两种瓷砖的长度分
别为 A/B 和C/D 。
【输出】
输出包含 T 行,第 i 行包含一个分数或整数,表示第 i 组数据的答案。如果答案为分数,
则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出
一个整数 X。
这个题是求分数的最小公倍数,有一个公式是
LCM=a∗b/GCD(a,b)
,但是在这里是不适用的,因为gcd是针对两个整数的最大公因数,所以……就开始找规律
突然发现
LCM(A/B,C/D)=LCM(A,B)/GCD(C,D)
,这样就可以A了
正解:
A/B和C/D通分,就是AD/BD和BC/BD,这样就是求AD和BC的最小公倍数再除以BD
#include <iostream>
#include <cstdio>
using namespace std;
int gcd(int x,int y)
{
if(y==0)
{
return x;
}
return gcd(y,x%y);
}
int main()
{
freopen("tile.in","r",stdin);
freopen("tile.out","w",stdout);
int T;
cin>>T;
while(T--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int p=a*c/gcd(a,c);
int q=gcd(b,d);
int tmp=gcd(p,q);
if(q==tmp)
{
cout<<p<<endl;
continue;
}
else
{
cout<<p/tmp<<'/'<<q/tmp<<endl;
continue;
}
}
return 0;
}