请问这段计算Greatest Common Divisor的Java函数逻辑是否正确?
该GCD函数的计算逻辑不正确,存在多处核心问题
主要错误点:
- 循环终止逻辑完全错误:只要当前
i不能同时整除a和b,函数就直接输出当前gcd并终止循环。比如输入a=9、b=15时,i=2无法整除两者,函数直接输出1,但正确的最大公约数是3,完全漏掉了后续更大的公约数候选值。 i的递增逻辑混乱:只有当i能整除a和b,且之后无法再整除其中一个时,才会递增i。但如果i一开始就不能整除两者,根本不会触发i的递增,直接退出循环,导致所有后续可能的公约数都没被检查。
错误场景验证
以输入a=9、b=15为例:
- 初始状态
gcd=1,i=2 - 检查发现
9%2≠0且15%2≠0,直接进入else分支,输出Greatest Common Divisor :1并终止程序 - 实际9和15的最大公约数是3,函数结果完全错误
质因数分解思路的修正版实现
如果想用质因数分解的方式实现GCD,正确逻辑应该是从i=2开始,持续尝试整除两个数,直到i超过两数的最小值:
public static void Greatest_Common_Divisor(int a, int b) { int gcd = 1; int i = 2; int min = Math.min(a, b); while (i <= min) { if (a % i == 0 && b % i == 0) { gcd *= i; a /= i; b /= i; min = Math.min(a, b); } else { i++; } } System.out.println("Greatest Common Divisor :" + gcd); }
当然,更高效的方法是使用欧几里得算法(辗转相除法),时间复杂度更低:
public static void Greatest_Common_Divisor(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } System.out.println("Greatest Common Divisor :" + a); }
内容的提问来源于stack exchange,提问作者Rutvik Pathak
相关产品推荐
相关产品推荐

