求多个数的最大公约数

本文介绍了如何使用辗转相除法(欧几里得算法)求解多个正整数的最大公约数,包括单个数的情况和多个数的情况。通过一系列的例子详细解释了算法的原理和步骤,展示了一种有效计算最大公约数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求多个数的最大公约数,我们可以采用先求两个数的最大公约数,然后再用这个最大公约数与其余的数循环求最大公约数;

还可以多个数进行辗转相除法;

辗转相除法

又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公因子的算法。

辗转相除法的实现,是基于下面的性质:

  1:(a,b)=(a,ka+b),其中a、b、k都为自然数

  就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数组,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2。这里有一个比较简单的证明方法来说明这个性质:如果p是a和ka+b的公约数,p整除a,也能整除ka+b。那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的。

  还有另外一个性质也是很必要:

  2:(0,a)=a

  由这两个性质得到的,就是更相减损术:

  (78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2

  基本上思路就是大数减去小数,一直减到能算出来为止。不过在平时的计算过程中,往往不必计算到最后一步,比如在上面的过程中,到了(8,6),就已经能够看出其结果。

  我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法。

  用辗转相除法求(a,b).设r0=b,r1=a,反复运用除法算式,得到一系列整数qi,ri和下面的方程:

  r0=q1r1+r2,r2<r1(r2,r1)

  r1=q2r2+r3,r3<r2(r3,r2)

  r2=q3r3+r4,r4<r3(r4,r3)

  ………………

  rn-3=qn-2rn-2+rn-1,rn-1<rn-2 (rn-1,rn-2)

  rn-2=qn-1rn-1+rn,rn-2<rn-1 (rn-1,rn)

  rn-1=qnrn。 (rn,0)

  相当于每一步都运用原理①把数字进行缩小,上面右边就是每一步对应的缩小结果,可以看出,最后的余数rn就是a和b的公约数。我们以一个题为例说明基本过程。

  例题:求(326,78)

  326=4×78+14(78,14)

  78=5×14+8 (14,8)

  14=1×8+6 (6,8)

  8=1×6+2 (6,2)

  6=3×2 (0,2)

  所以(326,78)=2。这和我们用更相减损术算出来的结果是一样的。

int gcd(int m, int n)
{
	if (m < n)
	{
		int tmp = m;
		m = n;
		n = tmp;
	}
	if (n == 0)
		return m;
	else
		return gcd(n, m % n);
}

多个数的最大公约数:

int main()
{
	int n;
	cout << "请输入要求多少个数:" ;
	cin >> n;
	if (n <= 0)
		return 0;
	int *a = new int[n];
	for (int i = 0; i < n; ++i)
	{
		cout << "请输入第" << i+1 << "个数:";
		cin >> a[i];
		cout << endl;
	}

	int number = a[0];
	for (int i = 1; i < n; ++i)
	{
		number = gcd(number, a[i]);
	}
	cout << "最大公约数是:"<< number << endl; 
}

 多个数的辗转相除法

  我们可以如法炮制多个数的辗转相除法。利用的原理就是:(a,b,c,d,……)=(a,b+a,c+a,d+a,……),我们先炮制前面的更相减损术,举例说明方法如下:

  例题:求(4,18,22,16)

  取最小的数4,其他的每一个数都与之相减,结果与4组成新的一组数,那么新数组与原数组的最大公因数相等,当出现零以后,排开零对剩下的数进行相同的处理。即:

  (4,18,22,16)=(4,14+4,18+4,12+4)=(4,14,18,12)

  =(4,10,14,8)=(4,6,10,4)=(4,2,6,0)=(0,2,2,4)=(0,2,0,2)=(0,0,2,0)=2

  所以(4,18,22,16)的最大公因数为2.

  同样的道理,在实际操作中,大可不必进行到最后一步,只需要进行到某一步就已经可以看出答案,比如在上面的过程中,到了(4,2,6,0)我想就应该可以看出其值为2了吧!

  相应的,我们也可以炮制多个数的辗转相除法

  第一步,取最小的数a,然后用剩下的数除以a,得到的余数和a组成新数组,然后对新数组进行同样的动作;当出现零的时候,排除零,对其余的数进行相同的动作。直到最后只剩下一个非零数,这个数就是原数组的最大公约数。

  例题2:求(120,168,328,624,320)

  (120,168,328,624,320)

  =(120,48,88,24,80)(因为168除以120余48,328除以120余88,……)

  =(24,0,0,16,8)

  =(0,0,8,0,0)

  =8


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值