m和n的最大公约数就是能够同时整除他它们的最大正整数。
第一种:欧几里得算法求最大公约数:
/* 欧几里得算法: * 两个不全为0的非负整数m,n的最大公约数记为 gcd(m,m),代表能够整除m和 * n的最大正整数。 * gcd(m,n) = gcd(n, m mod n) (mod 是取余,或取模%) * 重复循环上面的等式,直到 m mod n 等于0。最后的m值就是gcd. * 为什么?gcd(m, 0) = m. m 最后的取值是 m, n的初值的最大公约数。 * gcd(m, 0) 意味着 (前者m % 后者n) == 0,即能整除了。此时的m * 就是最大公约数。 * 举个栗子:gcd(10,6) = gcd(6,4) = gcd(4,2) = gcd(2,0) = 2; * gcd(60,24) = gcd(24,12) = gcd(12,0) = 12; * * 换个算法文字描述如下: * 需求:用欧几里得算法求最大公约数,gcd(m,n); * 第一步:对于给定的m,n,不全为0;m>n;如果n = 0,则返回m值作为结果, * 同时计算过程结束。否则,进入下一步。 * 第二步:将m除以n,取余数赋值给r; * 第三步:将n的值赋值给m,将余数r赋值给n;返回第一步。 * */ /* pseudocode: * gcdByEuclid(m,n) * //使用欧几里得算法计算gcd(m,n) * //输入:两个不全为0的非负整数 * //输出:m, n的最大公约数 * while n ≠ 0 do * r = m mod n * m = n * n = r * return m * / //Java代码实现 // function to get gcd public static int gcdByEuclid(int m, int n) { int r; while (n != 0) { r = m % n; m = n; n = r; } return m; }第二种:连续整数检测法 求最大公约数:
/* 根据定义,m 和n 的最大公约数是能够同时整除它们的最大正整数。其中,这个最大公约数不大于m和n的较小者。 令temp = min{m,n}; 检查下t是否能够整除m和n;如果能,t就是最大公约数; 如果不能,将t 减去1,再作判断,继续尝试直到出现一个值能同时整除m 和 n; 而且,t>=1(当t = 1时,判断肯定成立,因为1能整除任何正整数。) */ /* 连续整数法求最大公约数算法 文字描述: 第一步:将min{m, n} 赋值给temp; 第二步:m 除以 t, 取余数。如果余数为0,进入第三步。否则,进入第四步。 第三步:m 除以t,取余数,如果余数为0,返回temp作为结果; 否则,进入第四步。 第四步:把 temp 值减1,返回第二步。 */ pseudocode: gcdByContinuouslyDivison(m, n) //使用连续整除的方法计算gcd(m,n) //输入两个正整数m,n //输出m, n 的最大公约数 int temp = min{m, n} while(m mod temp ≠ 0 or n mod temp ≠ 0) do temp-- return temp //Java代码实现 // function to get gcd public static int gcdByContinuousDivision(int m, int n) { // 第一步:将min{m, n} 赋值给temp; int temp = m; if (m > n) { temp = n; } // 判断m%temp, n%temp, while (m % temp != 0 || n % temp != 0) { //第四步:把 temp 值减1 temp--; } return temp; }