2017-07-04 27 views
0

只是想爲您在閱讀本文時可能遇到的一般編碼和邏輯錯誤事先道歉。我最近發現了歐拉計劃,並認爲這很有趣。我已經明確指出,不僅要找到答案,而且還要提供一個通用函數,可以在給定相應輸入的情況下找到任何類似案例的答案。舉例來說,問題編號4,涉及迴文,可以在這裏看到:https://projecteuler.net/problem=4如何避免列表分析迴文的順序?

基本上我所做的是找到一種方法來乘以給定的位數號碼的每一個可能的組合,n,則發現了迴文產品。但是,高於3位的數字只是需要太長時間才能處理。我相信這是因爲我使用list()函數來利用索引來確定產品是否是迴文。有沒有另一種方法來做這種性質的事情?我覺得這是通過一個圓孔推倒正方形。

這裏是有問題的功能。

def palindrome(n): 
    number = 0 
    for i in range(0,n): 
     number = number + 9 * pow(10, i) 
    a = pow(10, n - 1) - 1 
    b = pow(10, n - 1) 
    while a * b < number * number: 
     a = a + 1 
     b = a 
     while b <= number: 
      c = a * b 
      b = b + 1 
      digits = list(str(int(c))) 
      lastdigits = digits[::-1] 
      numdigits = len(digits) 
      middle = int((numdigits - (numdigits % 2))/2) - 1 
      if numdigits > 1 and digits[:middle + 1] == lastdigits[:middle + 1] and digits[0] == digits[-1] == '9' and numdigits == 2 * n: 
       print(c) 
+1

您的問題在這裏肯定與使用列表無關。事實上,python中迴文檢查的簡單解決方案很大程度上依賴於切片符號。您的問題出現在您的while循環中,這些while循環需要基於輸入值進行指數級更大數量的迭代。你應該問自己,「這些真的有必要嗎?」 (提示:他們不是)。 –

+0

是的,看到第一個響應後,我意識到這完全是我如何接近解決方案。 – quesadyllan

+0

請不要將_solved_添加到標題中。通過接受答案,告訴其他人現在問題已經解決。謝謝。 – Bugs

回答

3

查找兩個3位數字的乘積的最大回文。」

3位號碼是100什麼 - 999一件事有關最大的產品是有保證的:兩個操作數必須儘可能大。

因此,從最大的數字(999)到最小的(100)開始循環是有意義的。我們可以將回文附加到列表中,然後返回最大的一個。

當您計算產品時,請使用str(...)將其轉換爲字符串。現在,由於python的字符串拼接,檢查後記很容易。如果string == string[::-1],字符串是迴文,其中string[::-1]什麼都不做,只是返回原件的反轉副本。

實施這些戰略,我們有:

def getBiggestPalindrome(): 
    max_palindrome = -1 
    for i in range(999, 99, -1): 
     for j in range(999, i - 1, -1): 
      prod = i * j 
      str_prod = str(prod) 
      if str_prod == str_prod[::-1] and prod > max_palindrome: 
       print(prod) 
       max_palindrome = prod 

    return max_palindrome 

getBiggestPalindrome()

而且,這將返回

>>> getBiggestPalindrome() 
906609 

注意,您可以使用range函數從start產生價值,到end,與step。迭代在end之前停止,這意味着最後的值將是100.

+1

哇,夥計。顯示我有多少學習。感謝您的洞察力。 – quesadyllan

+0

@quesadyllan我的歉意。我以前的回答不正確。請現在看看。直覺依然如故。但是可能存在比當前發現的產品更大的產品,因爲內部和外部循環不以相同的速度運行。您可能已經發現999 * 100是迴文,但998 * 997可能會產生更大的迴文。看起來我們確實需要完全通過這兩個循環。 –

+0

內循環是否真的需要從'999'開始,還是可以從'i'開始? –