这个题的叙述有点迷,个人的理解是首先要计算出一天之内转多少圈,然后找出相遇的时候最少要转多少圈。
所谓的周期的单位应该是“圈/天”,通过高中物理必修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;
}