求两个数m和n的最大公约数,方法有很多种,最容易想到的就是遍历到min(m, n)为止,找出最大的公约数,再进行剪枝,遍历到min(m, n)的平方根为止。方法有很多,上述两种只是最简单的,也是最没有技术含量的,接下来记录的是一些较为巧妙的方法。
算法出自古希腊数学家欧几里得所著的《几何原本》,这本书里面讲解了一个简单的公约数的算法。用现代数学的术语来表示,欧几里得算法采用的方法就是递归下列等式,直到m mod n等于0:
gcd(m, n) = gcd(n, m mod n) (m mod n 表示m除以n之后的余数)
一般传统的计算gcd(m, n)的算法如下:
第一步:将min(m, n)的值赋给t;
第二步:m除以t,如果余数为0,则进入第三步;否则进入第四步;
第三步:n除以t,如果余数为0,返回t的值作为结果;否则进入第四步;
第四步:t = t - 1;返回第二步。
注意这个算法有一个输入的要求,不可以输入0,因为输入0的话t会等于0,也就会报错。
实现的代码如下:
private int gcd(int m, int n) {
int result = 1;
int t = Math.min(m, n);
if (t == 0) {//筛选出输入有问题的输入
retu