2016-03-07 86 views
1

今天我練了使用我的編碼測試projecteulers問題。在做主要因素分工的同時,我偶然發現了一些我覺得奇怪的事情。下面是相關的代碼(res是一個ArrayList):如果VS while循環歐拉計劃-3主要因素劃分

for (int x = 2; x <= n; x++){  
     if (n % x == 0){ 
      System.out.println("Prime found: " + x); 
      res.add(x); 
      n = n/x; 
     }  
    } 

哪個劃分成1000 [2,4,5,25]。 過了一會兒,我試圖與一個while -loop替換if語句來和它印我的正確答案[2,2,2,5,5,5]。

顯然沒有財產以後我不明白,可能有人給我講解一下,好嗎?

編輯:

較新的代碼:

for (int x = 2; x <= n; x++){  
     while (n % x == 0){ 
      System.out.println("Prime found: " + x); 
      res.add(x); 
      n = n/x; 
     }  
    } 
+0

你還可以發佈你的while循環版本嗎? – Nadir

+1

'while'是做一些代碼,直到某些條件變成假的(所以它** **循環),'if'是做一些代碼,如果某些條件爲真(所以** **一次) – 2016-03-07 14:21:14

+0

https://開頭的文檔。 oracle.com/javase/tutorial/java/nutsandbolts/while.html – assylias

回答

3

的區別是:

  • 如果使用if,每個號碼只檢測一次。所以,如果你能夠拉出2,你只能這樣做一次。下一個你可以拉出來的數字是4,儘管它不是一個素數。 同樣適用於5人。 25.
  • 如果使用while,當測試數,直到你知道它不再在測試的數量。
+0

謝謝,猜這解釋了爲什麼if語句使用遞歸解決。 – GabbaGandalf

1

您也可以把它變成

for (int x = 2 ; x <= n/x ;) {  
     if (n % x == 0) { 
      System.out.println("Prime factor: " + x); 
      res.add(x); 
      n = n/x; 
     }  
     else { 
      x++;   // increment moved here 
     } 
    } 
if (n > 1) { 
    System.out.println("Prime factor: " + n); 
    res.add(n); 
} 

我也改變了終止條件,使其更加的情況下有效,其中n最大素因子本身是大的,因爲如果n = a*ba <= b,然後a*a <= a*b = n,即a <= n/a

這將重複的首要因素的考驗,因爲你已經發現,一些數字有相同幅度的多個主要因素(如1000 = 2 * 2 * 2 * 5 * 5 * 5)。這相當於您的while循環,因爲增量現在是有條件的,只有在測試候選人不是n的因素時才執行。

+0

感謝您的提示! – GabbaGandalf