题目大意
解题思路
利用公式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.函数体内的参数使用混乱问题,因此要能清晰掌握解题思路