问题陈述:
回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。
找出由两个3位数字的乘积制成的最大回文。
这就是我所做的。
for x in range(999,100,-1):
for y in range(x,100,-1):
check = str(x*y)
check_length = len(check)
if check_length % 2 == 0:
if check[0:check_length//2] == check[check_length:check_length//2:-1]:
print(check)
break
所以我删除了所有重复产品(即999x998 = 998x999),将其转换为字符串,并在反转第二个字符串后检查两半是否相同。这不会产生任何结果。我不是在寻找答案,而是寻找方向的暗示,并指出代码的任何问题。谢谢!
修改
for x in range(999,100,-1):
for y in range(x,100,-1):
check = str(x*y)
check_length = len(check)
if check[0:check_length//2] == check[check_length:check_length//2:-1]:
print(check)
break
检查的样本输出
580085
906609
119911
282282
853358
修改
这是我的最终版本。感谢您的所有投入。
largest_palindrome = 0
for x in range(999,100,-1):
for y in range(x,100,-1):
product = x*y
check = str(x*y)
if check == check[::-1]:
if product > largest_palindrome:
largest_palindrome = product
print(largest_palindrome)
答案 0 :(得分:2)
你的支票错了。我们来看一个例子:
>>> check = '123321'
>>> check_length = len(check)
>>> check[0:check_length//2]
'123'
>>> check[check_length:check_length//2:-1]
'12'
正如你所看到的,你正在砍掉一个角色。那是因为您将字符串拆分为check[6:3:-1]
,这使得索引3
保持不变(因为范围不包括结尾)。所以正确如下:
>>> check[check_length:check_length//2 - 1:-1]
'123'
但实际上你并不需要这种复杂性。没有必要将字符串分成两半并比较两半。回文是一个向前读取相同向后的字符串。所以只需将整个字符串与反向的整个字符串进行比较:
>>> check
'123321'
>>> check[::-1]
'123321'
>>> check == check[::-1]
True
这也很容易检查一个你完全不考虑的案例:字符串长度不均匀。数字12321
也是一个回文,但由于字符串长度是5,你完全忽略它。
最后,您的代码还有两个问题:
break
不会破坏外部循环。因此,您将停止迭代y
,但x
的下一次迭代将开始,因此您将继续搜索一段时间。在这种情况下,您还需要一种方法来打破外部循环。x
开始,然后检查所有可能产生回文的y
。但是这会给你举例998 * 583
作为最大的回文,但是很容易产生数量(低x)会产生更大的回文。所以你应该检查你找到的所有回文,或者用另一种方式进行迭代。答案 1 :(得分:1)
def reverse(n):
Number = n
Reverse = 0
while(Number > 0):
Reminder = Number %10
Reverse = (Reverse *10) + Reminder
Number = Number //10
return Reverse
def multiple(i, j):
return i * j
def checkPalindrone(n, rn):
if (n == rn):
return True
else:
return False
def maxPalindrone():
mult = 0
returnPalidrone = []
for i in range(100,1000):
for j in range(100,1000):
mult = multiple(i,j)
if (checkPalindrone(mult, reverse(mult))):
returnPalidrone.append(mult)
else:
continue
return max(returnPalidrone)