2013-03-05 80 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 - 現在你只檢查兩個,不是所有的連續整數權力。