HDOJ——1019:Least Common Multiple(求n个数的最小公倍数)

题目就不说了,就是求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个数的最大公约数。也是这样先求两个的,然后再求这个求出来的最大公约数和下面数字的公约数,以此类推。

从别的博客上了解到:

说明:
n(n>=3)个整数,不存在最大公约与最小公倍的积等于这n个整数之积的性质。因此不能套用2个整数的性质,以防出错。

那就说明2个数时,存在最大公约与最小公倍之积等于这2个整数之积的性质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值