求多个数的最大公约数
来源:互联网 发布:嗑瓜子网络意思 编辑:程序博客网 时间: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
- 求多个数的最大公约数
- 求多个数的最大公约数
- 求多个数的最小公倍数或最大公约数
- 项目一:求多个数的最大公约数
- java求多个数的最大公约数,最小公倍数。
- 求多个数的最大公约数和最小公倍数
- java求多个数的最大公约数,最小公倍数。
- 求多个数的最大公约数方法
- 求多个数的最大公约数和最小公倍数
- 求2个数的最大公约数
- 求2个数的最大公约数
- 求二个数的最大公约数
- 求4个数的最大公约数
- 求4个数的最大公约数
- 求2个数的最大公约数
- 求2个数的最大公约数
- 求2个数的最大公约数
- 求2个数的最大公约数
- 二维码生产
- LeetCode OJ : Reverse Integer
- leetcode第一刷_Longest Consecutive Sequence
- 云计算之路-阿里云上:神奇的“黑色30秒”再次出现,究竟是谁的错?
- ViewPager触摸切换图片并自动切换
- 求多个数的最大公约数
- 获取设备唯一ID的几种方式
- POJ3544 Journey with Pigs 动规基础贪心思想
- 运行TCL脚本出现个错误
- List<Map<String, String>> 转 Map<String, List<String>>
- sdut2605 A^X mod P 山东省第四届ACM省赛(打表,快速幂模思想,哈希)
- Java连接MySQL数据库及简单操作代码
- 程序内存空间的分配
- c语言之良好的编程习惯(三)