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

如何用Java计算1到50之间所有质数的和?现有代码输出结果仅为2求排查与修正

问题排查与修正方案

我来帮你梳理下代码里的问题,你现在输出结果只有2,主要是这几个核心逻辑错误导致的:

1. 因数计数器未重置

你在代码开头只初始化了一次count变量,但每次检查新的数字i时,并没有把count重新归零。第一次检查i=2时,count会被累加为2,之后所有循环里count一直保持这个值,后续的数字判断逻辑完全混乱,根本无法正确识别质数。

2. 质数判断时机错误

你在内层循环遍历j的过程中,只要count等于2就立刻把i加到总和里,但质数的定义是仅能被1和自身整除的数,必须等遍历完所有可能的因数后,再判断count是否恰好等于2,而不是中途触发累加操作。

修正后的基础版本代码

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        // 遍历2到50的所有数字(质数从2开始)
        for(int i = 2; i <= 50; i++) {
            int count = 0; // 每次检查新数字时,重置因数计数器
            // 遍历所有可能的因数
            for(int j = 1; j <= i; j++) {
                if(i % j == 0) {
                    count++;
                }
            }
            // 遍历完成后判断是否为质数
            if(count == 2) {
                System.out.println("找到质数:" + i);
                sum += i;
            }
        }
        System.out.println("1到50之间所有质数的和:" + sum);
    }
}

优化版本(减少循环次数)

上面的基础版本可以正常运行,但内层循环遍历到i有点浪费性能。实际上,判断质数时只需要检查到i的平方根即可——如果i有大于平方根的因数,那对应的另一个因数必然小于平方根,所以提前终止循环能提升效率:

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for(int i = 2; i <= 50; i++) {
            boolean isPrime = true;
            // 只检查到i的平方根,且从2开始(1本身不是质数的因数判断项)
            for(int j = 2; j <= Math.sqrt(i); j++) {
                if(i % j == 0) {
                    isPrime = false;
                    break; // 找到因数就跳出循环,无需继续检查
                }
            }
            if(isPrime) {
                System.out.println("找到质数:" + i);
                sum += i;
            }
        }
        System.out.println("1到50之间所有质数的和:" + sum);
    }
}

运行优化版本后,会输出正确的质数列表和总和:2+3+5+7+11+13+17+19+23+29+31+37+41+43+47 = 328。

内容的提问来源于stack exchange,提问作者Vibhor Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:02:32