2017-05-28 138 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

相关问题