2016-10-10 25 views
-4

我們正在努力尋找乘以兩個3位數字所產生的最大回文數。迴文編號是從兩側讀取相同的數字(例如:12345654321或簡單的9009)。 以下代碼編譯正確,但顯然存在邏輯錯誤,因爲當它應該是906609時,輸出是749947.如果有人能夠幫助解釋我在哪裏得到這個問題的邏輯錯誤,那將是非常好的。歐拉項目#4最大回文產品

boolean valid = false; 
for (int i = 999*999; i > 100*100; i--) { 
    if (i/100000 == i % 10 && 
     i/10000 % 10 == i/10 % 10 && 
     i/1000 % 10 == i/100 % 10) { 
     int buffer = i; 
     int total = 1; 
     for (int k = 2; k < buffer; k++) { 
      if (buffer % k == 0) { 
      buffer /= k; 
      total *=k; 
      } 
     } 
     if (buffer >= 100 && buffer < 1000 && total >=100 && total < 1000) { 
      System.out.println(i); 
      System.out.println(total); 
      System.out.println(buffer); 
      break; 
     } 
    } 
    } 
    } 
} 
+0

當你在你的IDE中附加了一個調試器並且一行一行地通過代碼行時,你觀察到了什麼? – Kon

+0

沒有真正分析你正在使用的試金石測試,我會問,你粘貼的代碼段中第一行代碼的目的是什麼?你不會在任何地方設置valid = true .... –

+0

在你的試金石測試中測試邏輯的另一個提示是首先嚐試一個更簡單的測試,比如將i轉換成等於自身的字符串 –

回答

0
906609 = 3 * 11 * 83 * 331 = 2739 * 331 = 913 * 993 = ... 

您的代碼解析爲buffer = 331, total = 2739,其失敗的if聲明。

建議:而不是檢查從998001的所有號碼爲10000,並試圖找到導致乘以當數3位數的值,使用雙for環3位數字,並發現,也是最大的產品一個迴文。

0

這種方法更容易遵循和運作。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Palindrome 
{ 
    private static List<Integer> palindromes = new ArrayList<Integer>(); 

    public static void main(String[] args) 
    { 
    for (int i = 999; i > 99; i--) 
    { 
     for (int j = 999; j > 99; j--) 
     { 
     if (isPalendrome(i * j)) 
     { 
      palindromes.add(i * j); 
     } 
     } 
    } 
    if (!palindromes.isEmpty()) 
    { 
     Collections.sort(palindromes); 
     System.out.println(palindromes.get(palindromes.size() - 1)); 
    } 
    } 

    private static boolean isPalendrome(int number) 
    { 
    char[] word = String.valueOf(number).toCharArray(); 
    int i1 = 0; 
    int i2 = word.length - 1; 
    while (i2 > i1) 
    { 
     if (word[i1] != word[i2]) 
     { 
     return false; 
     } 
     ++i1; 
     --i2; 
    } 
    return true; 
    } 
} 
0

那麼,你應該更容易解釋編寫代碼,但我們必須回到它的推理。外循環採用暴力方法,檢查迴文模式的所有數字,然後應用內部測試。

內在的測試就是事情出錯的地方。它試圖變得聰明,但產生了一個邏輯錯誤。我看到它試圖做的是將發現的數字因數分解爲buffertotal,打算成爲兩個三位數字。然而,它只是稍後檢查它們是三位數;他們計算時不考慮這條規則。

k被用作從buffer轉換到total的潛在因素。每個數字都被檢查一次,其中不包括任何具有正方形或更高功率因數的數字。更重要的是在這種情況下,他們從低到高進行檢查,直到total不再小於buffer。那麼906609會發生什麼?

(%i1) factor(906609); 
(%o1) 3 11 83 331 

算法穩定在3 * 11 * 83 * 331,但是3 * 11 * 83 = 2739這樣錯誤的位數。尋求的答案使用不同的因素:3 * 331 * 11 * 83。因式分解法是可行的,但您需要檢查產生三位數產品的因素分組。