Project Euler#10 Java解决方案不起作用

Project Euler#10 Java解决方案不起作用,java,math,primes,Java,Math,Primes,我试图找出素数之和

我试图找出素数之和<2000000。这是我的Java解决方案,但我似乎无法得到正确的答案。请就可能出现的错误提供一些意见,并对代码提供一般性建议表示感谢

打印“sum”给出:1308111344,这是不正确的

编辑:
谢谢你的帮助。将int更改为long和您将那些只能被平方根整除的数字视为素数(如25)。不要用
i
试试
i你的iPrime对正方形不起作用。iPrime(9)返回true。

如前所述,错误有两个:

  • 您使用的
    int
    不足以容纳该总和。。您应该使用
    long
  • 您使用了
    这是我的解决方案

      public class ProjectEuler {
    
        public static boolean isPrime(int i) {
            if (i < 2) {
                return false;
            } else if (i % 2 == 0 && i != 2) {
                return false;
            } else {
                for (int j = 3; j <= Math.sqrt(i); j = j + 2) {
                    if (i % j == 0) {
                        return false;
                    }
                }
    
                return true;
            }
        }
    
    
        public static long sumOfAllPrime(int number){
            long sum = 2;
    
            for (int i = 3; i <= number; i += 2) {
                if (isPrime(i)) {
                    sum += i;
                }
            }
    
            return sum;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(sumOfAllPrime(2000000));
        }
    }
    
    公共类项目{
    公共静态布尔iPrime(int i){
    如果(i<2){
    返回false;
    }else if(i%2==0&&i!=2){
    返回false;
    }否则{
    对于(intj=3;j,通过有效地使用,我解决了这个问题,下面是我的代码

    public class SumOfPrime {
    
        static void findSum()
        {
            long i=3;
            long sum=0;
            int count=0;
            boolean[] array = new boolean[2000000];
            for(long j=0;j<array.length;j++)
            {
             if((j&1)==0)
              array[(int)j]=false;   
             else    
             array[(int)j]=true;
            }
            array[1]=false;
            array[2]=true;
            for(;i<2000000;i+=2)
            { 
                if(array[(int)i] & isPrime(i))
                {   
                    array[(int)i]=true;
                    //Sieve of Eratosthenes
                    for(long j=i+i;j<array.length;j+=i)
                        array[(int)j]=false;
                }
            }
            for(int j=0;j<array.length;j++)
            {
                if(array[j])
                {   
                 //System.out.println(j);
                 count++;   
                 sum+=j;
                }
            }   
            System.out.println("Sum="+sum +" Count="+count);
        }
        public static boolean isPrime(long num)
        {
            boolean flag=false;
            long i=3;
            long limit=(long)Math.sqrt(num);
            for(;i<limit && !(flag);i+=2)
            {
                if(num%i==0)
                {
                    flag=false;
                    break;
                }   
            }
            if(i>=limit)
             flag=true;
            return flag;
        }
    
        public static void main(String args[])
        {
            long start=System.currentTimeMillis();
            findSum();
            long end=System.currentTimeMillis();
            System.out.println("Time for execution="+(end-start)+"ms");
        }
    
    }
    

    如果你有疑问,请告诉我这不是问题,或者至少不是唯一的问题。长一点会更好[更快]比一个大整数大。它显然足够大了,因为1+2+3+…+2000000=200001000000,小于一个长整数的最大值。@Pointy:在这两个错误中,这一个给出了最大的幅度误差。但是这两个错误都会导致答案错误。不幸的是,没有办法接受两个答案,所以如果你愿意,你可以接受将我的答案复制到你的答案中,接受这份荣耀。;(是的,你是对的;我不确定它是否能挤进去,但又喝了1/2杯咖啡,我做了基本的数学。当我做那些欧拉投影问题时,我用的是Erlang,所以我从来不用担心整数的大小(所有Erlang整数都像“BigInteger”):-)哇,为什么按向下投票?由于我在这里陈述的原因,算法实际上是错误的。错误。他从3循环到数字的平方根。如果数字是,比如说25-你不需要检查任何高于5的值。如果有除数大于5-那么另一个除数将小于5,并且会被检查在循环的开始。他没有循环到平方根!!他使用的比较是
    啊,你是对的,我稍微误解了你的回答。对不起,我的投票倒过来了:作为一个提示,我会把Math.sqrt(nr)放在for条件之外,这样我就不会每次在每个循环中都像:stop=Math.sqrt(nr)那样被评估(也可以使用ceil,以避免浮点舍入错误)对于(int i=3;ii*i
    开始消除倍数,下面所有的倍数都必须以较小的因子消除。这是一个很大的增益。通过忽略偶数,可以在同一空间中存储两倍的布尔值。它只需要一些算术运算就可以解析为正确的索引。此外,由于布尔值使用整数对于存储,您正在浪费大量空间。您可以更好地使用位数组:
      public class ProjectEuler {
    
        public static boolean isPrime(int i) {
            if (i < 2) {
                return false;
            } else if (i % 2 == 0 && i != 2) {
                return false;
            } else {
                for (int j = 3; j <= Math.sqrt(i); j = j + 2) {
                    if (i % j == 0) {
                        return false;
                    }
                }
    
                return true;
            }
        }
    
    
        public static long sumOfAllPrime(int number){
            long sum = 2;
    
            for (int i = 3; i <= number; i += 2) {
                if (isPrime(i)) {
                    sum += i;
                }
            }
    
            return sum;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(sumOfAllPrime(2000000));
        }
    }
    
    public class SumOfPrime {
    
        static void findSum()
        {
            long i=3;
            long sum=0;
            int count=0;
            boolean[] array = new boolean[2000000];
            for(long j=0;j<array.length;j++)
            {
             if((j&1)==0)
              array[(int)j]=false;   
             else    
             array[(int)j]=true;
            }
            array[1]=false;
            array[2]=true;
            for(;i<2000000;i+=2)
            { 
                if(array[(int)i] & isPrime(i))
                {   
                    array[(int)i]=true;
                    //Sieve of Eratosthenes
                    for(long j=i+i;j<array.length;j+=i)
                        array[(int)j]=false;
                }
            }
            for(int j=0;j<array.length;j++)
            {
                if(array[j])
                {   
                 //System.out.println(j);
                 count++;   
                 sum+=j;
                }
            }   
            System.out.println("Sum="+sum +" Count="+count);
        }
        public static boolean isPrime(long num)
        {
            boolean flag=false;
            long i=3;
            long limit=(long)Math.sqrt(num);
            for(;i<limit && !(flag);i+=2)
            {
                if(num%i==0)
                {
                    flag=false;
                    break;
                }   
            }
            if(i>=limit)
             flag=true;
            return flag;
        }
    
        public static void main(String args[])
        {
            long start=System.currentTimeMillis();
            findSum();
            long end=System.currentTimeMillis();
            System.out.println("Time for execution="+(end-start)+"ms");
        }
    
    }
    
    Sum=142913828922 Count=148933
    Time for execution=2360ms