您的位置:首页 > 其它

More than one way to get gcd(greatest common divisor,最大公约数)

2017-06-06 23:35 330 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: