2012-11-17 81 views
1

該程序發現首要因素,並打印出來是這樣的:因子(順序)係數(順序)爲什麼我會得到奇怪的輸出?

import java.util.Scanner; 
import java.util.ArrayList; 

public class Factorise2 
{ 
    public static ArrayList<Integer> get_prime_factors(int number) 
    { 
//Get the absolute value so that the algorithm works for negative numbers 
     int absoluteNumber = Math.abs(number); 
     ArrayList<Integer> primefactors = new ArrayList<Integer>(); 
     ArrayList<Integer> newprimes = new ArrayList<Integer>(); 
     int b; 
     int c = (int)Math.sqrt(absoluteNumber); 
//Get the square root so that we can break earlier if it's prime 

     for (int j = 2; j <= absoluteNumber;) 
     { 
//Test for divisibility by j, and add to the list of prime factors if it's divisible. 
      if (absoluteNumber % j == 0) 
      { 
       primefactors.add(j); 
       absoluteNumber /= j; 
       c = (int)Math.sqrt(absoluteNumber); 
      } 
      else 
      { 
       for (int a = 0; a < newprimes.size();) 
       { 
//Change j to the next prime 
        b = newprimes.get(a); 
        if (j % b == 0) 
        { 
         j++; 
         a = 0; 
        } 
        else 
        { 
         a++; 
        } 
       } 
       newprimes.add(j); 
      } 
      if (j > c) 
      { 
       primefactors.add(absoluteNumber); 
       break; 
      } 
     } 
     return primefactors; 
    } 

    public static void main(String[] args) 
    { 
//Declare and initialise variables 
     int number; 
     int count = 1; 
     Scanner scan = new Scanner(System.in); 
//Get a number to work with 
     System.out.println("Enter integer to analyse:"); 
     number = scan.nextInt(); 
//Get the prime factors of the number 
     ArrayList<Integer> primefactors = get_prime_factors(number); 
//Group the factors together and display them on the screen 
     System.out.print("Prime factors of " + number + " are "); 
     primefactors.add(0); 
     for (int a = 0; a < primefactors.size() - 1; a++) 
     { 
      if (primefactors.get(a) == primefactors.get(a+1)) 
      { 
       count++; 
      } 
      else 
      { 
       System.out.print(primefactors.get(a) + " (" + count + ") "); 
       count = 1; 
      } 
     } 
    } 
} 

它的工作原理在大多數情況下,但是當我輸入131033809,我得到一個奇怪的輸出:

C:\Users\Eamon>java Factorise2 
Enter integer to analyse: 
4 
Prime factors of 4 are 2 (2) 
C:\Users\Eamon>java Factorise2 
Enter integer to analyse: 
128 
Prime factors of 128 are 2 (7) 
C:\Users\Eamon>java Factorise2 
Enter integer to analyse: 
9 
Prime factors of 9 are 3 (2) 
C:\Users\Eamon>java Factorise2 
Enter integer to analyse: 
121 
Prime factors of 121 are 11 (2) 
C:\Users\Eamon>java Factorise2 
Enter integer to analyse: 
131033809 
Prime factors of 131033809 are 11447 (1) 11447 (1) 

爲什麼不把它寫

11447 (2) 
+5

你認真地相信,這是Java中的一個錯誤,而不是你對Java的工作方式的理解有一點機會嗎?真?? –

+1

你甚至看過代碼嗎?沒有太多的地方可能會出現我的錯誤。我標記你沒有建設性。 –

+1

雖然你的自大狂需要解決,因爲它會阻止你解決這個問題。根據您目前的編碼水平,您找到真正的Java錯誤的機率太小,太小,您必須按照「我不瞭解的Java究竟是怎麼回事」來看待您的問題。你可能認爲這是沒有建設性的,但你如何看待問題很重要,並且會影響你如何解決問題。您需要使用調試器或println語句對代碼進行一些調試,因爲您必須*接受該錯誤是您的錯誤,除非得到其他方面的證明。 –

回答

11

在Java中,Integer DA tatype是一個對象。因此,如果對象身份相同,==操作將僅返回true:注意,這不涉及值是否實際相等。你應該使用:

if (primefactors.get(a).equals(primefactors.get(a+1))) 
+0

+1,http://stackoverflow.com/questions/3130311/weird-java-boxing – eXXXXXXXXXXX2

+0

然後問題是如何工作的其他情況? –

+1

你應該提到小絕對值的Integer的緩存 - 默認情況下是'-128'到'127'--這就是爲什麼'=='爲小素數因子工作的原因。 –

相關問題