求 Python 中两个三位数乘积的最大回文数
Finding the largest palindrome of the product of two 3-digit numbers in Python
所以我要解决的挑战是找到由两个 3 位数的乘积组成的最大回文。我是 Python 的新手,所以我的代码还不够优雅或折射,但有一个我似乎找不到的逻辑错误。
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,但我的代码没有找到这个。谁能帮我解决我逻辑上的缺陷?
你的代码在数字和字符串之间做了很多不必要的转换,这使得错误很难被发现。代码中唯一需要字符串表示的地方是在确定数字是否为回文时。所以那应该是代码进行转换的唯一地方。
你的函数有逻辑错误convert_to_num_list()
。它采用 one 数字的字符串表示形式和 returns 包含该数字的 1-list。因此,"123321"
返回为 [123321]
。然后,您获取该 1-list 的 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
这是一个函数,用于查找我在 Whosebug 中找到的两个 3 位数乘积的最大回文。
Link 我发现的-
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
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)))
palin=[]
for a in (range(1,1000)):
for b in (range(1,1000)):
d = a*b
d=str(d)
if len(d)>5:
if d[0]==d[5]:
if d[1]==d[4]:
if d[2]==d[3]:
palin.append(d)
palin.sort()
print(palin[len(palin)-1])
使用列表推导式可以减少代码行数,但我会提供一个替代选项,以使其更具可读性。
List_of_palindromes = [i*j for i in range(100,1000) for j in range(i,1000) if str(i*j)==str(i*j)[::-1]]
print(max(List_of_palindromes))
More Readable form
List_of_palindromes = []
for i in range(100,1000):
for j in range(100,1000):
if str(i*j)==str(i*j)[::-1]:
List_of_palindromes.append(i*j)
print(max(List_of_palindromes))
看看这个..!
这可以缩短,但这样更容易理解(对于初学者)。
l = list(range(100, 1000))
m = list(range(100, 1000))
prod_max = 0
def is_palindrome(num):
temp = num
rev=0
while num > 0:
div = num%10
rev = rev*10 + div
num = num //10
if rev == temp:
return True
else:
return False
for i in range(len(l)):
for j in range(len(m)):
prod = l[i]*m[j]
if is_palindrome(prod) == True:
if prod > prod_max:
prod_max = prod
num1 = l[i]
num2 = m[j]
print(f'{prod_max} the product of {num1} and {num2} is a palindrome')
所以我要解决的挑战是找到由两个 3 位数的乘积组成的最大回文。我是 Python 的新手,所以我的代码还不够优雅或折射,但有一个我似乎找不到的逻辑错误。
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,但我的代码没有找到这个。谁能帮我解决我逻辑上的缺陷?
你的代码在数字和字符串之间做了很多不必要的转换,这使得错误很难被发现。代码中唯一需要字符串表示的地方是在确定数字是否为回文时。所以那应该是代码进行转换的唯一地方。
你的函数有逻辑错误convert_to_num_list()
。它采用 one 数字的字符串表示形式和 returns 包含该数字的 1-list。因此,"123321"
返回为 [123321]
。然后,您获取该 1-list 的 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
这是一个函数,用于查找我在 Whosebug 中找到的两个 3 位数乘积的最大回文。
Link 我发现的-
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
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)))
palin=[]
for a in (range(1,1000)):
for b in (range(1,1000)):
d = a*b
d=str(d)
if len(d)>5:
if d[0]==d[5]:
if d[1]==d[4]:
if d[2]==d[3]:
palin.append(d)
palin.sort()
print(palin[len(palin)-1])
使用列表推导式可以减少代码行数,但我会提供一个替代选项,以使其更具可读性。
List_of_palindromes = [i*j for i in range(100,1000) for j in range(i,1000) if str(i*j)==str(i*j)[::-1]]
print(max(List_of_palindromes))
More Readable form
List_of_palindromes = []
for i in range(100,1000):
for j in range(100,1000):
if str(i*j)==str(i*j)[::-1]:
List_of_palindromes.append(i*j)
print(max(List_of_palindromes))
看看这个..! 这可以缩短,但这样更容易理解(对于初学者)。
l = list(range(100, 1000))
m = list(range(100, 1000))
prod_max = 0
def is_palindrome(num):
temp = num
rev=0
while num > 0:
div = num%10
rev = rev*10 + div
num = num //10
if rev == temp:
return True
else:
return False
for i in range(len(l)):
for j in range(len(m)):
prod = l[i]*m[j]
if is_palindrome(prod) == True:
if prod > prod_max:
prod_max = prod
num1 = l[i]
num2 = m[j]
print(f'{prod_max} the product of {num1} and {num2} is a palindrome')