Tyvj 铺瓷砖

【问题描述】
有一面很长很长的墙。你需要在这面墙上贴上两行瓷砖。你的手头有两种不同尺寸的瓷
砖,你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度
为 A/B ,贴在第二行的每块瓷砖长度为C/D.
两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙是对齐的。你想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。
【输入】
输入的第 1 行包含一个正整数 T,表示测试数据的组数。
接下来 T 行,每行 4 个正整数 A,B,C,D,表示该组测试数据中,两种瓷砖的长度分
别为 A/B 和C/D 。
【输出】
输出包含 T 行,第 i 行包含一个分数或整数,表示第 i 组数据的答案。如果答案为分数,
则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出
一个整数 X。

这个题是求分数的最小公倍数,有一个公式是 LCM=ab/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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值