欧几里得算法求最大公约数的递归和非递归实现
2016-05-02 20:08
323 查看
在数学中,欧几里得算法,又称辗转相除法,是求最大公约数(greatest common divisor)的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
两个整数的最大公约数是能够同时整除它们的最大的正整数。
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 21 × (12 − 5) = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。
递归公式表示位:
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
参考
1. 辗转相除法,维基百科,自由的百科全书,https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95
两个整数的最大公约数是能够同时整除它们的最大的正整数。
辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 21 × (12 − 5) = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。
递归公式表示位:
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
/** * 欧几里得算法求最大公约数 * 连续计算余数知道余数是0为止,最后的非零余数就是最大公因数 * @param m * @param n * @return */ public static long gcd(long m, long n) { while (n != 0) { long rem = m % n; m = n; n = rem; } return m; } /** * 欧几里得算法求最大公约数 * 递归实现 */ public static long gcd(int a,int b) { return b > 0 ? gcd(b, a%b) : a; }
参考
1. 辗转相除法,维基百科,自由的百科全书,https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95
相关文章推荐
- java的静态代理
- List--LinkedList(浅识)二
- Volley相关知识
- Python爬虫折腾纪录
- 待整理内容
- nyoj_42 一笔画问题
- 3. Longest Substring Without Repeating Characters
- 动态规划——最少硬币问题
- hdu 5677 ztr loves substring 多重背包
- Android Studio 文件名颜色代表含义
- elk搭建完整搭建【篇1】
- Golang实现红黑树
- iOS中黄色文件夹和蓝色文件夹的区别
- 文章标题
- 默认参数与占位符参数
- Asp.net WebApi 项目示例(增删改查)
- 【AKOJ】1313-DNF又爆满啦
- ubuntu 的使用
- 经典SQL练习题5----面试题及答案
- 通过sqli-labs学习sql注入——基础挑战之less1-10