HDU 1713 相遇周期 — 欧几里得算法与最大公约数,最小公倍数

来源:互联网 发布:如何查询域名的有效期 编辑:程序博客网 时间:2024/06/05 15:56

这个题的叙述有点迷,个人的理解是首先要计算出一天之内转多少圈,然后找出相遇的时候最少要转多少圈。

所谓的周期的单位应该是“圈/天”,通过高中物理必修1讲过的单位制可以很容易地去理解这道题。

原题目实质上等价于求两个分数的最小公倍数。求最小公倍数的算法如下:首先将两个分数约分至既约分数,随后计算出两个分子的最小公倍数(LCM)赋给最终的分子,计算出两个分母的最大公约数(GCD),最后即可得到结果。

求最大公约数的一个经典算法就是Euclidean Algorithm(欧几里得算法),又称辗转相除法。

算法的逻辑非常清晰,简述成自然语言如下所示:

Input:任意两个整数x1、x2;

Process:x2的值赋给x1,计算x1 mod x2,将x1 mod x2的结果赋给x2;

Termination Condition:x2 == 0;

Output:x1.

递归代码如下(C++):

long long GCD(long long a, long long b)   //最大公约{return b != 0 ? GCD(b, a%b) : a;}

求LCM的方法也比较简单,x1*x2/GCD(x1,x2)

这里没给出以上两种算法的详细证明,编者在数论方面的能力很一般,就不在这丢人了(23333),网上的很多大牛已经给出了非常完备的证明,大家可以尽情参考.

最后附上本题AC的代码,题目应该还是水题一道:

千万别忘了约分,之前两次没A都是因为没约分,感觉自己智商受到了极大碾压= =||

#include<iostream>using namespace std;//#include<cmath>long long GCD(long long a, long long b)   //最大公约{return b != 0 ? GCD(b, a%b) : a;}long long LCM(long long a, long long b)    //最小公倍{long long fractor = GCD(a, b);long long mulip = a*b;long long res = mulip / fractor;return res;}int main(){int n;long long x1, x2, x3, x4;char ch;cin >> n;long long factor;while (n--){cin >> x1;cin >> ch;cin >> x2;cin >> x3;cin >> ch;cin >> x4;while (factor = GCD(x1,x2), factor != 1){x1 /= factor;x2 /= factor;}while (factor = GCD(x3,x4), factor != 1){x3 /= factor;x4 /= factor;}long long nume = LCM(x1, x3);long long deme = GCD(x2, x4);if (nume % deme == 0){cout << (nume / deme) << endl;}else{cout << nume << "/" << deme << endl;}}system("pause");return 0;}


原创粉丝点击