求最大公约数的几种算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
求最⼤公约数的⼏种算法
给定两个整数,求出这两个整数的最⼤公约数是我们从⼩就接触过的问题,但是我们如何⽤更简洁的算法来计算呢?
本⽂中,假定这两个整数是m和n且m>=n>=0。
让我们从最简单的算法说起!
⼀、Consecutive Integer Test——连续整数检测算法
由最⼤公约数的概念,我们可以知道,能够同时被两个给定整数整除的最⼤整数,即是最⼤公约数。
那么我们可以最简单的想出⽤暴⼒搜索的⽅法,从两个整数中较⼩的那⼀个开始,向下穷举遍历,找到最⼤公约数。
当然,这种⽅法是低效的,存在着很⼤的不确定性。
Step1:将min{m,n}的值赋给t。
Step2:判断t是否为0,如果是0,返回max{m,n};否则,进⼊第三步。
Step3:m除以t,如果余数为0,则进⼊第四步;否则进⼊第五步。
Step4:n除以t,如果余数为0,则返回t值作为结果;否则进⼊第五步。
Step5:把t的值减1,返回第三步。
1int consecutiveIntegerTest(int m, int n) {
2int t = n;
3while (t != 0) {
4if (m % t == 0) {
5if (n % t == 0)
6return t;
7else
8 --t;
9 } else
10 --t;
11 }
12return m;
13 }
最终的返回值m,即为m和n的最⼤公约数。
⼆、Euclidean(recursion)——欧⼏⾥得算法
求取最⼤公约数最经典的算法莫过于欧⼏⾥得算法了,既是所谓的辗转相除法,⽐起暴利搜索更加⾼效稳定。
欧⼏⾥得算法有递归和⾮递归两种表达⽅式。
(递归⽅式)
1int Euclidean_Recursion(int m, int n) {
2if (n == 0)
3return m;
4return method1(n, m % n);
5 }
(⾮递归⽅式)
1int Euclidean_nonRecursion(int m, int n) {
2while (n != 0) {
3int r = m % n;
4 m = n;
5 n = r;
6 }
7return m;
8 }
以上就是求出m,n最⼤公约数的三种算法,希望⼤家互相学习。
⼈⽣有理想,拼搏需坚持。
阶段⼩⽬标,跬步成千⾥! 。