C++求解N个数的最大公约数、最小公倍数

一、2个数的最大公约数
// 辗转相除法
int gcd(int a, int b)
{
	if (b == 0)	return a;
	return gcd(b, a % b);
}
// 也可以直接用STL: __gcd(a, b);
二、2个数的最小公倍数
int lcm(int a, int b)
{
	int t = gcd(a, b);
	return a / t * b;
}
// (a * b) / gcd 也可以,但是a / gcd * b 是为了防止爆longlong

证明:
  假设 x = gcd(a, b),y = lcm(a, b)。
  此时有 a = m * x,b = n * x,其中m,n互为质数(如果m、n不是互为质数,那仍可以从m、n中提取出一个相等的因子,那此时的x就不是最大公约数了)。
  则y = m * n * x (因为a = m * x,b = n * x,而m、n互为质数{且此时m、n也是互为质数的所有值中最小的,因为x为最大公约数})。
  将上式两边同时乘x,则 x * y = m * x * n * x。
  可证明 lcm * gcd = a * b。

三、N个数的最大公约数
/**
 * @param a:数组
 * @param n:求数组中n个数的最大公约数
 */
int ngcd(int *a, int n)
{
	if (n == 1)	return *a;
	return gcd(a[n - 1], ngcd(a, n - 1))
}

每两个数所求的x = gcd(a, b),x <= a,x <= b。

四、N个数的最小公倍数
int nlcm(int *a, int n)
{
	if (n == 1) return *a;
	return lcm(a[n - 1], nlcm(a, n - 1));
}

每两个数所求的y = lcm(a, b),y >= a,y >= b

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值