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
相关产品推荐
相关产品推荐

