新手问题,但是我无法弄清楚该问题在我的代码中出了什么错误。问题要求得到所有2,000,000以下的质数之和。
我不知道为什么我的代码适用于较小的集合,但是当我耐心等待我的代码完成2,000,000时,它会给出错误的答案。 1,179,908,154。
免责声明,我意识到我编写的代码效率极低/浪费很多,除其他外,我还应该使用Eratosthenes筛。我只是想弄清楚为什么它会给出错误的答案。
public static void main(String args[]) {
int[] primes = new int[2000000];
int index=0;
int ans=0;
//finding primes and populating array
for (int candidate=2; candidate<=2000000; candidate++) {
System.out.println(candidate); //so I can watch the numbers go up
for (int divisor=1; divisor<=candidate; divisor++) {
if (candidate%divisor==0 && candidate==divisor) {
primes[index]=candidate;
index++;
break;
}
if (candidate%divisor==0 && candidate!=divisor && divisor!=1) {
break;
}
}
}
//adding primes
for (int m=0; m<primes.length; m++) {
ans+=primes[m];
}
System.out.println(ans);
}
答案 0 :(得分:2)
我认为您的问题属于ans
类型。
在Java中,整数长4个字节,这意味着它们只能存储从-2,147,483,648到2,147,483,647的数字。
低于200万的所有素数之和远大于这些值。
这里发生的是您的int
变量溢出并“四处走动”(它从最大值“跳到”最小值)。
尝试将ans
的类型更改为long。
答案 1 :(得分:0)
将Java程序加载到本地Scala REPL中时,我会得到同样的错误结果。
scala> org.oeis.primes.PrimeLister.listPrimes(2_000_000)
res3: java.util.ArrayList[Integer] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ...
scala> import collection.JavaConverters._
import collection.JavaConverters._
scala> res3.asScala
^
warning: object JavaConverters in package collection is deprecated (since 2.13.0):
Use `scala.jdk.CollectionConverters` instead
res4: scala.collection.mutable.Buffer[Integer] = Buffer(2, 3, 5, 7, 11, 13, 17, 19, ...
scala> res4.toList
res5: List[Integer] = List(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, ...
scala> res5.scanLeft(0)(_ + _)
res7: List[Int] = List(0, 2, 5, 10, 17, 28, 41, 58, 77, 100, 129, 160, 197, ...
scala> res5.scanLeft(0L)(_ + _)
res12: List[Long] = List(0, 2, 5, 10, 17, 28, 41, 58, 77, 100, 129, 160, 197, ...
scala> res7.takeRight(1)
res15: List[Int] = List(1179908154)
scala> res12.takeRight(1)
res16: List[Long] = List(142913828922)
是的,请尝试使用long
来添加素数。