problem description:求n个数的最小公倍数
思路:首先联想到的是最大公约数(GCD)的辗转相除法
普通代码如下:
int GCD(int a,int b){
int t;
if(b>a){
t=a;
a=b;
b=t;
}
while(t!=0){
t=a%b;
a=b;
b=t;
}
return a;
}
普通代码行数过长,可以改写成递归形式
如下:
int GCD_recursion(int a,int b){
if(a%b==0)
return b;
else
return GCD_recursion(b,a%b);//倘若a<b,一次递归即能调整对大小
}
但是题目的要求是求一组数据的最小公倍数(LCM),通过查询资料得到一下公式:
最小公倍数=两数的乘积/最大公约(因)数
也就是说求LCM前必须求GCD。
完整解法如下:
#include <stdio.h>
int GCD(int a,int b);//this function will return the greatest common divisor(最大公约数)
int LCM(int a,int b);
int main(){
int n,i,a,b,fs;
while(~scanf("%d", &n)){
a=1;
for(i=0;i<n;i++){
scanf("%d", &b);
a=LCM(a,b);
}
printf("%d\n", a);
}
}
int GCD(int a,int b){
if(a%b==0)
return b;
else
return GCD(b,a%b);//倘若a<b,一次递归递归即能调整对大小
}
//最小公倍数=两数的乘积/最大公约(因)数
int LCM(int a,int b){
return (a*b)/GCD(a,b);
}
这里出现了一个非常奇怪的问题:
当LCM中return (a*b)/GCD(a,b);时,案例测试正确,但是提交却通不过。
当LCM中return b / GCD(a, b) * a;时,却提交成功,令人费解。