计算两个数字的最大公约数,我们在九年义务教育中学过用数学的方式计算,那么在程序中也只需要将数学的计算方式对应的转换到代码上来,也就可以了
欧几里得算法(辗转相除法)
这个是使用的最为普遍的办法,也是一种通用而高效的方法,适用于任何大小的整数。它的核心思想是通过连续的除法和取余操作,直到余数为零来计算最大公约数。
步骤:
1、选择两个整数a和b,且a >= b
2、用a除以b,得到余数r
3、将b作为a,r作为b
4、重复步骤2和3,直到r=0,此时,b则为最大公约数
例如:
100和28的最大公约数
初始时:a = 100,b = 28
100 / 28 = 3 …16
得到a = 28,b = 16
28 / 16 = 1 …12
得到a = 16,b = 12
16 / 12 = 1 …4
得到a = 12,b = 4
12 / 4 = 3
此时a = 12, b = 4,且r = 0,所以最大公约数为b,也就是4
那么这个是数学的计算方式,我们转换为代码即为
/*** 欧几里得算法(辗转相除法)* @param p 整数1* @param q 整数2* @return 最大公约数*/public static int gcd(int p, int q) {if (q == 0) return p;int r = p % q;return gcd(q, r);}
相减法
这个是一种计算最大公约数的古老方法,又称为更相减损法。它的基本思想是反复用两个数中较大的数减去较小的数,直到两个数相等。最后得到的相等的数就是最大公约数。
步骤:
1、选择两个整数a和b,且a >= b
2、用a减去b,得到差d,如果d等于0,那么b即为最大公约数
3、如果d不等于0,将a替换为较大的数,将b替换为较小的数
4、重复步骤2和3,直到d等于0,此时,b即为最大公约数
例如:
100和28的最大公约数
初始时:a = 100,b = 28
100 - 28 = 72
得到a = 72,b = 28
72 - 28 = 44
得到a = 44,b = 28
44 - 28 = 16
得到a = 28,b = 16
28 - 16 = 12
得到a = 16,b = 12
16 - 12 = 4
得到a = 12,b = 4
12 - 4 = 8
得到a = 8, b = 4
8 - 4 = 4
得到a = 4,b = 4
4 - 4 = 0
此时a = 4,b = 4, 且d = 0,所以我们最大公约数b = 4
那么这个是数学的计算方式,我们转换为代码即为
/*** 相减法* @param p 整数1* @param q 整数2* @return 最大公约数*/public static int xjf(int p, int q) {if (q == 0) return p;int r = Math.abs(p - q);return xjf(Math.max(r, q), Math.min(r, q));}