如何在for循环中筛选质数?Java代码问题排查
问题分析与修正
你的代码存在几个关键逻辑错误,导致结果不符合预期:
- 质数判断逻辑混乱:内层循环里,每遇到一个不能整除i的j就执行添加操作,还把赋值
isPrime = true当成判断条件,这会让同一个数被重复加入列表。 - 错误包含了1:1不符合质数定义(质数需大于1),外层循环不该从1开始。
- 无效循环次数:内层循环j从i-1遍历到1完全没必要,所有数都能被1整除,只需检查到2即可,还能提升效率。
- 未及时终止循环:一旦找到能整除i的数,就该立刻跳出内层循环,没必要继续检查剩余数值。
修正后的代码
import java.util.ArrayList; public class primenumbers { public static void main(String[] args) { int totalNumber = 1000; ArrayList<Integer> numbers = new ArrayList<>(); // 质数从2开始,外层循环从2起步 for(int i = 2; i <= totalNumber; i++){ boolean isPrime = true; // 内层循环优化到i的平方根,减少不必要的计算 for(int j = 2; j <= Math.sqrt(i); j++){ if (i % j == 0){ isPrime = false; // 找到因数后立即跳出循环 break; } } // 循环结束后统一判断,是质数再添加到列表 if(isPrime){ numbers.add(i); } } System.out.println(numbers); } }
关键改进点说明
- 调整外层循环起始值:直接从2开始,排除非质数的1。
- 优化内层循环范围:只检查到
Math.sqrt(i),因为如果i存在大于其平方根的因数,必然对应一个更小的因数,大幅减少循环次数。 - 修正判断逻辑:内层循环仅负责标记是否为质数,循环结束后统一执行添加操作,避免重复加入。
- 及时终止无效循环:找到因数后立刻break,避免多余计算。
内容的提问来源于stack exchange,提问作者Scott Burkhart
相关产品推荐
相关产品推荐

