Java素数判断代码中if与else分支同时执行的原因是什么?
原始代码运行异常的根本原因
你的if-else逻辑本身没有问题,不会出现两个分支同时执行的情况,问题出在循环迭代中isPrime变量的值被后续遍历的i覆盖了,具体拆解如下:
- 原始
prime方法的初始值设为false,每次遍历因子i的时候,都会根据当前i能不能整除num直接给isPrime赋值,完全覆盖了之前的判断结果。 - 举个例子,判断
num=9是不是质数:- 遍历到
i=2时,9%2=1不等于0,进入else分支,isPrime被设为true - 遍历到
i=3时,9%3=0,进入if分支,isPrime被设为false - 遍历到
i=4时,9%4=1不等于0,进入else分支,isPrime又被重新设为true - 后续
i=5/6/7/8都不能整除9,isPrime会一直保持true,最后返回true,错误判定9是质数。
- 遍历到
- 你修改后的代码逻辑是正确的:先默认
num是质数(isPrime=true),只要遍历到任意一个能整除num的因子,就把isPrime设为false,之后哪怕遍历到其他不能整除的因子,也不会再改回true,最后返回的结果就正确。
可选优化方案
如果想提升判断效率,还可以做两处修改:
- 找到能整除的因子后直接用
break跳出循环,不需要继续遍历后续的i - 循环终止条件可以从
i <= num -1改成i <= Math.sqrt(num),减少遍历次数
优化后的代码如下:
static boolean prime(long num) { if (num <= 1) return false; boolean isPrime = true; for (int i = 2; i <= Math.sqrt(num); i++) { if (num % i == 0) { isPrime = false; break; // 找到因子直接跳出循环 } } return isPrime; }
内容的提问来源于stack exchange,提问作者adrian
相关产品推荐
相关产品推荐

