2017-05-28 114 views
0

所以我試圖解決的挑戰是找到由兩個3位數字產品組成的最大回文。我是Python的新手,所以我的代碼還不夠優雅或折射,但有一個邏輯錯誤,我似乎無法找到。查找Python中兩個3位數字的最大回文數

def ispalindrome(n): 
    rev_n = str(n)[::-1] 
    if n == rev_n: 
     return True 
    else: 
     return False 


first_num = 100 
second_num = 100 
mylist=[] 
while first_num < 1000: 
    while second_num < 1000: 
     item = first_num * second_num 
     mylist.append(item) 
     second_num += 1 
    second_num = 100 
    first_num +=1 
# print (mylist) 
num_as_string = [] 
for i in mylist: 
    i = str(i) 
    num_as_string.append(i) 
print("Total products of two 3-digit numbers: {}").format(len(num_as_string)) 
print("-----------------------------------------------------") 

def convert_to_num_list(string_list): 
    new_num_list = [] 
    item = int(string_list) 
    new_num_list.append(item) 
    return new_num_list 



palindrome_list = [] 

for j in num_as_string: 
    if ispalindrome(j) == True: 
     palindrome_list.append(j) 
     palindrome_list.sort() 
     # print(palindrome_list) 
     x = convert_to_num_list(j) 
     largest_palindrome = max(x) 

print("Total palindroms of product of two 3-digit numers: {}").format(len(palindrome_list)) 

print("Largest palindrome = {}").format(largest_palindrome) 

問題是我得到的最大回文數是580085,它是995 * 583,但不是最大的迴文。我相信最大的迴文是906609,這是993 * 913,但我的代碼沒有找到。任何人都可以幫我解決我邏輯中的缺陷嗎?

+0

如果你想形成數量最多,爲什麼從100開始,上升到1000?如果你從999開始到100(一次在每個櫃檯一個單位),你可以在第一個迴文時立即停止搜索。 – jsbueno

+0

@jsbueno謝謝。這聽起來像是獲得這一結果的最有效方式。 – Burner918

+0

@jsbueno這種做法當然不會發生在我身上。這顯然是有效的,如果我使用900萬個數字而不是900個,我會對這個建議感到高興。但我懷疑它也可能很難得到正確的答案。 – BoarGules

回答

3

你的代碼在數字和字符串之間做了很多不必要的轉換,這使得錯誤很難找到。代碼中唯一需要字符串表示的地方是確定數字是否是迴文。所以這應該是代碼進行轉換的唯一位置。

邏輯錯誤在您的函數convert_to_num_list()中。它需要一個數字的字符串表示形式,並返回一個包含該數字的1-列表。因此,"123321"返回爲[123321]。然後您將該1-列表的max(),這總是傳遞給convert_to_num_list()的值。所以代碼永遠不會保留最大的值,因爲如果較小的值稍後進入,它將被覆蓋。該代碼報告995*583爲最大,因爲它晚於993*913,而這又是因爲995>993

您可以使用if語句解決該錯誤,但該程序過於複雜並且可能包含其他錯誤。我建議將代碼減少到生成最大回文的基本任務,而不打印中間結果,因爲代碼越簡單,查看邏輯錯誤就越容易。

def ispalindrome(n): 
    return str(n) == str(n)[::-1] 

mylist=[] 
for first_num in range(100,1000): 
    for second_num in range(100,1000): 
     item = first_num*second_num 
     if ispalindrome(item): 
      mylist.append(item) 
print(max(mylist)) 

這使你預期的答案:

906609 
0

這裏是發現我在計算器發現了兩個3位數字的產品的最大回文的功能。

鏈接到我的發現 - https://stackoverflow.com/a/7460573

def is_pal(c): 
     return int(str(c)[::-1]) == c 

    maxpal = 0 
    for a in range(999, 99, -1): 
     for b in range(a, 99, -1): 
      prod = a * b 
      if is_pal(prod) and prod > maxpal: 
       maxpal = prod 

    print maxpal 
0
n1=999 
n2=999 
k=0 
sl=[] 
while n1>1: 
    count=n1 
    while count>=1: 
    result=n1*count 
    res=str(result) 
    res1=res[::-1] 
    if (res==res1): 
     sl.insert(k,result) 
     k+=1 
    count=count-1 
    n1=n1-1 
print("largest pelindrom of 3 digit product is is %d" %(max(sl))) 
+0

歡迎來到StackOverflow!已經有一個被接受的答案,所以你應該用幾句話解釋你的答案與已經接受的答案是不同的。 – mrt

+0

由於我們必須找到最大的3位數字產品,所以我已經開始乘以更高的數字先執行更快,所以我從n1 = n2 = 999開始,並將n1臨時存儲在計數中,然後將n2乘以計數。我已經習慣了循環,以便程序不會錯過任何乘法和存儲在res中的乘法結果,通過將其轉換爲字符串,以便我們可以輕鬆地檢查此字符串是否是迴文。如果迴文被存儲在列表中並且最後我已經使用max函數打印了最大值。我執行了這兩個代碼,任何我的代碼需要4-5秒,而其他代碼需要5-6秒。 –

+0

原始答案的目的不是提供更好的算法,而是向OP解釋他的邏輯錯誤是什麼。因此它保留了與從可讀程序獲得正確結果一致的原始代碼(算法,變量名稱和一般結構)。你的算法效率提高40%(499,499迴文檢查而不是810,000),如果'sl.append(result)'而不是'sl.insert(k,result)',或者使用一個集合,它會更快。但它不回答這個問題*任何人都可以幫我解決我的邏輯中的缺陷嗎?* – BoarGules

相關問題