求多个数的最大公约数

来源:互联网 发布:嗑瓜子网络意思 编辑:程序博客网 时间:2024/05/16 06:31

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

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

辗转相除法

又名欧几里德算法(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;elsereturn 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


0 0