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

Java质数求和程序处理大数出错:输入超225287结果异常求排查

问题分析与修复方案

1. 结果错误的核心原因:整数溢出

你用int total = 0存储质数总和,但Java里int的最大值只有2147483647,而2000000以下所有质数的和是142913828922,远超过这个上限。当累加的数值超出int的范围时,会触发整数溢出,结果直接变成错误的负数或乱码值——这就是数值超过225287后返回错误结果的根本原因。

2. 次要问题:质数判断效率极低

你的isPrime方法循环从2遍历到i-1,时间复杂度是O(n),对于2000000这种大数,程序会慢到难以忍受。实际上判断质数只需要循环到√i就足够了:如果i有大于√i的因数,那必然对应一个小于√i的因数,没必要遍历到i-1。

修复后的代码

把总和变量改成long类型(能存到9223372036854775807,完全够装目标总和),同时优化质数判断逻辑,顺便把循环上限改成你需要的2000000:

public class PrimeSum {
    public static void main(String[] args) {
        PrimeSum is = new PrimeSum();
        long total = 0; // 改用long避免溢出
        for(int i = 2; i < 2000000; i++){ // 改成目标上限
            if(is.isPrime(i)){
                total += i;
                // 大数量下建议注释掉打印,否则会大幅拖慢速度
                // System.out.println(i);
            }
        }
        System.out.println(total);
    }

    boolean isPrime(int i){
        boolean prime = true;
        // 循环到√i即可,减少循环次数
        for(int n = 2; n * n <= i; n++){
            if(i % n == 0){
                prime = false;
                break;
            }
        }
        return prime;
    }
}

可选:更快的质数筛选方法

如果要处理更大范围的质数计算,推荐用埃拉托斯特尼筛法(Sieve of Eratosthenes),这种方法能一次性标记出所有非质数,效率比逐个判断高得多,适合2000000这种规模的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:43:29