HDU1713 相遇周期(数学)

来源:互联网 发布:手机淘宝网址 编辑:程序博客网 时间:2024/06/05 03:21

hdoj1713 相遇周期(密码20178B)

相遇周期

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3717    Accepted Submission(s): 1906


Problem Description
2007年3月26日,在中俄两国元首的见证下,中国国家航天局局长孙来燕与俄罗斯联邦航天局局长别尔米诺夫共同签署了《中国国家航天局和俄罗斯联邦航天局关于联合探测火星-火卫一合作的协议》,确定中俄双方将于2009年联合对火星及其卫星“火卫一”进行探测。

而卫星是进行这些探测的重要工具,我们的问题是已知两颗卫星的运行周期,求它们的相遇周期。
 

Input
输入数据的第一行为一个正整数T, 表示测试数据的组数. 然后是T组测试数据. 每组测试数据包含两组正整数,用空格隔开。每组包含两个正整数,表示转n圈需要的天数(26501/6335,表示转26501圈要6335天),用'/'隔开。
 

Output
对于每组测试数据, 输出它们的相遇周期,如果相遇周期是整数则用整数表示,否则用最简分数表示。
 

Sample Input
226501/6335 18468/4229359/11479 15725/19170
 

Sample Output
81570078/75431415


分析:

    数学题,网上很多解释发现有对有错,这里给出两个正确的解法。弱不会证明,dalao会的话请评论解释一下,在下感激不尽。


 方法一:.先化简 n / t; a = LCM(t1,t2)  , b = GCD(n1, n2),  ans = a / b;

方法二: 先都通分->求分子的最小公倍数Q -> Q / 之前通分后的分母 -> 化简;

下面是我用方法一做的代码:


#include<stdio.h>int gcd(int x, int y){    return y == 0 ? x : gcd(y, x % y);}int lcm(int x, int y){    return x / gcd(x, y) * y;}int a1, b1, a2, b2;int T;char c;int main(){    scanf("%d", &T);    while(T --)    {        scanf("%d%c%d %d%c%d", &a1, &c, &b1, &a2, &c, &b2);        int advance1 = gcd(a1, b1);        int advance2 = gcd(a2, b2);        a1 /= advance1;        b1 /= advance1;        a2 /= advance2;        b2 /= advance2;        int z = lcm(a1, a2);        int m = gcd(b1, b2);        if(m == 1)            printf("%d\n", z);        else            printf("%d/%d\n", z, m);    }}


另外还有暴力解法弱也不会QAQ,这道题要怎么推出来,如果现场赛这题必栽,求推导过程~(抱拳,jpg)

 

这道题不需要long long int 

原创粉丝点击