当我输入大数字Java时,任何关于为什么我的程序计算所有素数之和的想法都会被打破



我试图找到2000000以下所有素数的和,我的程序运行良好,直到我输入任何大于225287的数字,之后它开始给出错误的答案。有什么想法吗?

public class PrimeSum {

public static void main(String[] args) {
PrimeSum is = new PrimeSum();
int total = 0;

for(int i = 2; i < 225287; i ++){
if(is.isPrime(i)){
total += i;
System.out.println(i);
}
}
System.out.println(total);
}
boolean isPrime(int i ){
Boolean prime = true;

for(int n = 2; n< i; n++){
if(i % n == 0){
prime = false;
break;
}
}
return prime;
}
}

似乎,int total=0;无法容纳如此大的数量。

int类型,其是存储来自-2,147,483,648 to 2,147,483,647的整数的4 bytes中的大小

long类型,其是存储来自-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807的整数的8 bytes中的大小

现在,看看自己适合自己。

一旦达到225287,总和为2147431330。int的最大值为2147483647,因此添加下一个素数会使您超出int的范围,这会导致二进制数据滚动到负值。

如果您希望您的方法产生更高的总和,则需要更改数据类型。

附带说明一下,您可以通过只循环到Math.sqrt(i(.来优化isPrime(int i(

最新更新