题目就不说了,就是求n个数的最小公倍数。其实这个问题已经困扰我好久了,今天终于有机会把它解决了。
这道题用到了递归和辗转相除法。
n个数的最小公倍数,可以先求前两个数的最小公倍数(lcm),然后再用前面的lcm去与后面的数求lcm,依次类推。
然后怎样求最小公倍数呢,可以先去求最大公约数,然后用两个数的乘积除以最大公约数就好了。
这里要注意,因为lcm可能会溢出,所以返回值的时候有个小诀窍,return a/yue(a,b)*b; 先进行除法,再进行乘法就好了。
主要让我领会了递归调用。
#include<stdio.h>
int yue(int a,int b){
if(b) return yue(b,a%b);
else return a;
}
//在这里分别求出每两个数的最小公倍数;
int lcm(int a,int b){
return a/yue(a,b)*b; //小心这里会溢出;
}
int main(){
int t,i,n,m;
while(scanf("%d",&t)!=EOF){
while(t--){
scanf("%d",&n);
int first;
scanf("%d",&first);
for(i=1;i<n;i++){
scanf("%d",&m);
first=lcm(first,m);
}
printf("%d\n",first);
}
}
}
*对了,这个定理同时适用于求n个数的最大公约数。也是这样先求两个的,然后再求这个求出来的最大公约数和下面数字的公约数,以此类推。
从别的博客上了解到:
说明:
那就说明2个数时,存在最大公约与最小公倍之积等于这2个整数之积的性质。