重拾算法(三):求最大公约数的常用方法总结
来源:互联网 发布:有人招聘网络写手吗? 编辑:程序博客网 时间:2024/04/30 05:45
1.辗转相除法:
原理:
设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互质(假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
#include<stdio.h>int gcd(int a, int b){if (0 == a%b && b != 0){return b;}else{return gcd(b, a%b);}}int main(){int a, b;scanf("%d%d", &a, &b);if (a < b){int temp = a;a = b;b = temp;}int ans = gcd(a, b);printf("%d\n", ans);return 0;}
2.整数检测法:
原理:
找出两个数中最小的那个数n,然后从1到n遍历,找出最大公约数
#include<stdio.h>int main(){int a, b;scanf("%d%d", &a, &b);int ans = 0;if (a < b){int temp = a;a = b;b = temp;}for (int i = 1; i <= b; i++){if (a %i == 0 && b%i == 0){ans = i;}}printf("%d", ans);return 0;}
3.质因相乘法:
原理:例如:求12.18.54的最大公约数:
12 = 2 * 2 * 3;
18 = 2 * 3 * 3;
54 = 2 * 3 *3 *3;
所以最大公约数:
2 * 3 = 6;
具体的计算可以采用下列方法:(如图)
#include<stdio.h>bool isFlag(int num){bool flag = true;for (int i = 1; i <= num; i++){if (num %i == 0 && i != 1 && i != num){flag = false;break;}}return flag;}int main(){int a, b;scanf("%d%d", &a, &b);if (a < b){int temp = a;a = b;b = temp;}int numb = b;bool flag = true;int ans = 1;for (int i = 1; i <= numb; i++){if (isFlag(i)){if (a%i == 0){a = a / i;}else {flag = false;}if (b %i == 0){b = b / i;}else{flag = false;}if (flag == true){ans = ans *i;i = 1;}else{flag = true;}}}printf("%d", ans);return 0;}
1 0
- 重拾算法(三):求最大公约数的常用方法总结
- 求最大公约数方法的总结
- C语言中求最大公约数的算法(三种)
- 求最大公约数的三种算法实现
- 求最大公约数的三种算法
- 求两个数的最大公约数(三种方法)
- (java)求m,n最大公约数的三种方法
- 求最大公约数的三种方法
- C++求最大公约数的三种方法
- 求最大公约数的三种方法
- 求最大公约数(三种方法)
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- 求最大公约数的算法
- POJ(2388)
- 第1周项目1-C/C++语言中函数参数传递的三种方式
- 八皇后问题(典型的递归回溯)
- Activity和WMS关系梳理
- C-1-11-1 分离各位数
- 重拾算法(三):求最大公约数的常用方法总结
- 第二周项目二 程序的多文件组织
- 网络流24题——圆桌问题
- Oracle位图例子
- 五大主流深度学习框架比较分析:MXNET是最好选择
- HDU:Let the Balloon Rise
- 51nod1006 最长公共子序列Lcs--打表+输出
- 金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
- Red Black Tree(红黑树)