项目Euler问题10,答案错误,但为什么(Java)

时间:2020-09-23 02:47:35

标签: java

我知道

新手问题,但是我无法弄清楚该问题在我的代码中出了什么错误。问题要求得到所有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);
    }

2 个答案:

答案 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来添加素数。