晨跑 题解

题目描述

“无体育,不清华”、“每天锻炼一小时,健康工作五十年,幸福生活一辈子”

在清华,体育运动绝对是同学们生活中不可或缺的一部分。为了响应学校的号召,模范好学生王队长决定坚持晨跑。不过由于种种原因,每天都早起去跑步不太现实,所以王队长决定每 a a a天晨跑一次。换句话说,假如王队长某天早起去跑了步,之后他会休息 a − 1 a-1 a1天,然后第 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈美漩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值