2013-03-05 79 views
0

我最近开始学习Java,现在我正在尝试解决一些Eulerproject问题。Java中的算术错误

任务是:数字600851475143最大的素数是多少?

我能创造这个代码,但我得到一个错误:

代码

package exercises; 
import java.util.ArrayList; 

public class Euler3 { 

    // Main code 
    public static void main(String[] args) { 


     System.out.println(getPrimeFactors(15)); 
    } 

    // Code for breaking a number to prime factors 
    public static ArrayList getPrimeFactors(int n){ 

     ArrayList factors = new ArrayList(); 

     int d = 2; 

     while(n > 1){ 
      while(n%d == 0){ 
       factors.add(d); 
       n /= d; 
      } 
      d +=d; 
     } 

     return factors; 
    } 

} 

错误:

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at exercises.Euler3.getPrimeFactors(Euler3.java:22) 
    at exercises.Euler3.main(Euler3.java:9) 

我在做什么错?
谢谢

+3

您的逻辑似乎不正确。它只会被2的幂分,最终你会得到一个溢出,它会尝试除以0. – threenplusone 2013-03-05 00:47:30

回答

3

对于非常天真的解决方案,请尝试将行d += d更改为d += 1

+0

这个工作,谢谢 – intelis 2013-03-05 00:54:37

1

问题是您的d正在穿越Integer.Max限制和溢出。

3

d溢出来,我印ndwhile (n > 1)

15 2 
    15 4 
    15 8 
    15 16 
    15 32 
    15 64 
    15 128 
    15 256 
    15 512 
    15 1024 
    15 2048 
    15 4096 
    15 8192 
    15 16384 
    15 32768 
    15 65536 
    15 131072 
    15 262144 
    15 524288 
    15 1048576 
    15 2097152 
    15 4194304 
    15 8388608 
    15 16777216 
    15 33554432 
    15 67108864 
    15 134217728 
    15 268435456 
    15 536870912 
    15 1073741824 
    15 -2147483648 
    15 0 

我认为解决的办法是d++,不d+=d - 现在你只检查两个,不是所有的连续整数权力。