2015-11-14 62 views
0

我剛開始學習python。我試圖檢查整數x是否是迴文,然後將它除以範圍(從最大y即999開始)y = 999,998,...,100之間的數字。如果x/y = z並且z也是一個3位整數,則結束。否則從x中減去1並執行相同的過程。Python嵌套循環 - 無輸出

def EuQ4(): 
    x=998001 
    p=999 
    while 10000 < x: 
     x=x-1 
     if str(x)== str(x)[::-1]: 
      while p>100: 
       if x%p==0: 
        Pal=x/p 
        if Pal < 999: 
         print (Pal,p) 
         break 
        else: 
         x=x-1 
       else: 
        p=p-1 
     else: 
      x=x-1 
EuQ4() 

這是歐拉項目的問題4,即查找由兩個3位數字乘積組成的最大回文。

+0

你的問題到底是什麼? –

+0

我沒有輸出,代碼有什麼問題? –

+1

你不會回報什麼,所以你如何期待輸出? –

回答

1

這裏有幾個邏輯錯誤。有些會導致永遠不會結束的循環。例如,當x % p == 0Pal較大時會發生什麼999?你會得到一個無限循環。

我做了一些修改,但它仍然可以使用一些工作。

def EuQ4(): 
    x = 998001 
    while 10000 < x: 
     if str(x) == str(x)[::-1]: 
      print("{} is a pali!".format(x)) 
      # Move it here so each time it stats at the right 
      # number or else it will just skip it after it does it once. 
      p = 999 
      while p > 100: 
       if x % p == 0: 
        pali = int(x/p) 
        if pali < 999: 
         print(pali, p) 
         return 
       p -= 1 
     x -= 1 

EuQ4() 

編輯:

我在我的IDE中使用調試器發現了這些錯誤。您可以通過幾次逐行查看代碼來輕鬆完成同樣的任務。

0

p=999 befor while p > 100或使用for p in range(999, 100, -1)

p = 999 
while p > 100 

而且我認爲你打電話x=x-1太多次了。

1

我很抱歉,但它傷害了我的頭閱讀您的問題。如果你在嘗試這些問題的時候試圖學習Python,那麼我會提出這個備選答案 - 它不能回答你的問題,但它確實導致瞭解決方案,我認爲它更加Pythonic。該問題要求找到由兩個3位數字產品製成的最大的palindrone。所以輸入應該是3位數字。此代碼將允許您指定數字的數量,最大值和最小值(作爲整數)。

我並不是建議這是歐拉問題所提出的最佳解決方案,而是一種解決方案,讓您能夠接觸到Python中的一系列功能。

def min_value(integer): 
    min_val = '1' 
    for n in range(0,integer-1): 
     min_val+='0' 
    return int(min_val) 

def max_value(integer): 
    max_val = '9' 
    for n in range(0,integer-1): 
     max_val += '9' 
    return int(max_val) +1 

def find_max_palindrones(x,y): 
    minimum_value = min_value(x) 
    maximum_value = max_value(y) 
    palindrones = [] 
    working_range = [number for number in range(minimum_value,maximum_value,1)] 
    for x_value in working_range: 
     for y_value in working_range: 
      product = x_value * y_value 
      orig_order = [item for item in str(product)] 
      rev_order = [item for item in str(product)[::-1]] 
      if orig_order == rev_order: 
       palindrones.append(product) 
    max_p = max(palindrones) 
    return max_p 

>>>find_max_palindrones(3,3) 
906609