铺瓷砖

1.铺瓷砖
(tile.cpp/c/pas)
【问题描述】
  有一面很长很长的墙。 你需要在这面墙上贴上两行瓷砖。 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为 A/B ,贴在第二行的每块瓷砖长度为C/D 。本问题中你并不需要关心瓷砖的宽度。

  如上图所示, 两排瓷砖从同一起始位置开始向右排列, 两排瓷砖的第一块的左端的缝隙是对齐的。你想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。
【输入】
  输入的第 1 行包含一个正整数 T,表示测试数据的组数。接下来 T 行,每行 4 个正整数 A,B,C,D,表示该组测试数据中,两种瓷砖的长度分别为 A/B 和C/D 。
【输出】
  输出包含 T 行, 第 i 行包含一个分数或整数, 表示第 i 组数据的答案。 如果答案为分数,则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出
一个整数 X。
【输入输出样例 1】
 tile.in 
  2
  1 2 1 3
  1 2 5 6

 tile.out
  1
  5/2
见选手目录下的 tile/tile1.in 与 tile/tile1.out
【输入输出样例 1 说明】
  对于第一组数据,第一行瓷砖贴 2 块,第二行贴 3 块,总长度都为 1,即在距离起始位置长度为 1 的位置两行瓷砖的缝隙会再次对齐。对于第二组数据,第一行瓷砖贴 5 块,第二行贴 3 块,总长度都为 5/2 。
【输入输出样例 2】
  见选手目录下的 tile/tile2.in 与 tile/tile2.out
【数据规模与约定】
  对于 50%的数据,1≤A,B,C,D≤20
  对于 70%的数据,T≤10
  对于 100%的数据,T≤100,000,1≤A,B,C,D≤10,000

【题目分析】

  各种找lcm,数据类型要开long long,不然你会炸的很开心

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
ll a,b,c,d;
ll fenmu,fenzi;
ll fenzi1,fenzi2,yueshu;
int t;
ll gcd(ll x,ll y)
{
    if(!y) return x;
    return gcd(y,x%y);
}
ll lcm(ll x,ll y)//最小公倍数为两数相乘再除以gcd,为了防爆,可以先除再乘 
{
    ll zdgys=gcd(x,y);
    return x/zdgys*y;
}
int main()
{
    freopen("tile.in","r",stdin);
    freopen("tile.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
        fenmu=lcm(b,d);//将两个分数通分,找到两分母最小公倍数 
        fenzi1=fenmu/b*a;//分母通分之后相对应的分子 
        fenzi2=fenmu/d*c;
        fenzi=lcm(fenzi1,fenzi2);//两分子对答案分子的贡献 
        if(fenzi%fenmu==0)
            printf("%lld\n",fenzi/fenmu);
        else
        {
            yueshu=gcd(fenzi,fenmu);
            printf("%lld/%lld\n",fenzi/yueshu,fenmu/yueshu);
        }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

 

posted @ 2016-10-27 20:48  [lemon]  阅读(392)  评论(0编辑  收藏  举报
……