题目描述
“无体育,不清华”、“每天锻炼一小时,健康工作五十年,幸福生活一辈子”
在清华,体育运动绝对是同学们生活中不可或缺的一部分。为了响应学校的号召,模范好学生王队长决定坚持晨跑。不过由于种种原因,每天都早起去跑步不太现实,所以王队长决定每 a a a天晨跑一次。换句话说,假如王队长某天早起去跑了步,之后他会休息 a − 1 a-1 a−1天,然后第 a a a天继续去晨跑,并以此类推。
王队长的好朋友小钦和小针深受王队长坚持锻炼的鼓舞,并决定自己也要坚持晨跑。为了适宜自己的情况,小钦决定每 b b b天早起跑步一次,而小针决定每 c c c天早起跑步一次。
某天早晨,王队长、小钦和小针在早起跑步时相遇了,他们非常激动、相互鼓励,共同完成了一次完美的晨跑。为了表述方便,我们把三位同学相遇的这天记为第 0 0 0天。假设三位同学每次晨跑的时间段和路线都相同,他们想知道,下一次三人在跑步时相遇是第几天。由于三位同学都不会算,所以希望由聪明的你来告诉他们答案。
题目分析
其实题目就是想求王队长、小钦和小针三个人跑步天数的最小公倍数(LCM),分析出来这个,这道题就很好解。
最小公倍数的求解方法:先用 辗转相除法 求出 最大公因数 ,再用两个数的 乘积 除以 他们最大公因数,得数就是两数的最小公倍数。
下面是几种辗转相除法的代码,根据自己的喜好使用
辗转相除法代码(不压行,递归版)
int gcd(int x,int y){
if (x%y==0){
return y;
}
return gcd(y,x%y);
}
辗转相除法代码(压行,递归版)
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
辗转相除法代码(不压行,非递归版)
int gcd(int a,int b){
while(b){
int r=a%b;
a=b;
b=r;
}
return a;
}
STL版(不建议使用,赛场上不一定让用)
#include <algorithm>
__gcd(a,b);
下面是最小公倍数的代码
int lcm(int x,int y){
return x*y/gcd(x,y);
}
最后是完整代码
#include<bits/stdc++.h>
using namespace std;
long long a,b,c;//本题数据很大,需要用long long
long long gcd(long long a,long long b){//最大公因数
return !b?a:gcd(b,a%b);
}//个人比较喜欢这么写
long long lcm(long long x,long long y){//最小公倍数
return x*y/gcd(x,y);
}
int main(){
cin>>a>>b>>c;
long long ans=0;
ans=lcm(a,lcm(b,c));//lcm函数里会调用gcd函数
cout<<ans<<endl;
return 0;
}