You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:12:02