我试图找到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(