杭电1108——最小公倍数

题目大意
在这里插入图片描述
解题思路
利用公式LCM(A,B)=A/GCD(A,B)B求解(注:若利用LCM(A,B)=AB/GCD(A,B),则可能A*B会爆int)
因此本题的重点在于采用辗转相除法求解GCD的值

GCD的求解过程

假设x是10和14的最大公约数,那么10和14都是x的整数倍

那么14%10的余数4也是x的整数倍,求10和14的最大公约数就等价于求4和10的最大公约数
在这里插入图片描述
同理10%4的余数2也是x的整数倍,求10和14的最大公约数就等价于求4和2的最大公约数
在这里插入图片描述
以此类推当大的数%小的数的余数为0时,大的这个数就是10和14的最大公约数
在这里插入图片描述
这就是辗转相除法的完整解题思路!
代码实现

1  #include<stdio.h>
2  int gcd(int x,int y){    //这里的x,y所操作的值不用注意谁大谁小
3  	if(y!=0)
4  		return gcd(y,x%y);     //这里采用递归可以缩减代码
5  	return x;
6  }
7  int main(){
8  	int a,b;
9  	while(scanf("%d%d",&a,&b)==2){     //这里要注意题目中的输入输出要求
10 		printf("%d\n",a/gcd(a,b)*b);      //调用求解GCD的函数,同时利用公式求解LCM
11 	} 
12 	return 0;
13 }

遇到的bug
1.输入输出问题:不符合题目要求,积累了三种:
c语言:
第一种:

1 while(scanf("%d%d",&a,&b)==2){ 
2 		printf("%d\n",a/gcd(a,b)*b);
3	} 

第二种:

1	while(scanf("%d%d",&a,&b)!=EOF){ 
2		printf("%d\n",a/gcd(a,b)*b);
3	} 

c++

1	while(cin>>a>>b){ 
2		cout<<a/gcd(a,b)*b)<<endl;
3	} 

2.函数体内的参数使用混乱问题,因此要能清晰掌握解题思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值