我想找到2个3位数的最大回文产品。 这是我的代码:
for i in range(100,1000):
for x in range(100,1000):
number = i*x
number = str(number)
if number==number[::-1]:
print(number)
print("DONE")
它什么都不做,只打印Done。 我已将数字转换为字符串并完成切片但不起作用...只需打印完成。 我该如何解决这个问题?
修改
我想把这些回文列表放在一个列表中,然后按它们的大小排序。
mylist=[]
for i in range(999,99,-1):
for x in range(999, i-1, -1,):
number=i*x
number=str(number)
if number==number[::-1]:
print(number)
mylist.append(number)
mylist=sorted(mylist)
print("DONE")
for i in mylist:
for x in mylist:
if int(i) <= int(x):
mylist.pop(int(i))
if x<= i:
mylist.pop(int(x))
但它仍然不起作用...... 怎么解决?
答案 0 :(得分:3)
你应该检查每个号码,所以你的if语句应该在循环中。
这完全是关于代码的。
为了加快检查速度,您可以从LARGEST号码中查看,然后向下查看。
示例:for i in range(999, 99, -1)
。
你在这里使用了999,因为左边是INCLUSIVE,但是右边的阈值不是。
下一步是优化内循环。您不需要检查每个值。只需从999循环到i即可进行最佳检查。
有了这个alghoritm,您的代码将找到最大的回文数,而无需检查iversive x和i order。
在您的代码中,它可以检查30/70,然后检查70/30,例如
for i in range(999, 99, -1):
for x in range(999, i - 1, -1):
number = str(x * i)
if number == number[::-1]:
print(number)
print('Done!')
范围内的 -1
是步骤。如此消极的一步它下降到第二个数字
答案 1 :(得分:1)
我假设您正在处理Problem 4 of Project Euler
您可以使用max
:
>>> max((i*j,i,j) for i in range(999,99,-1) for j in range(999,i-1,-1) if str(i*j)==str(i*j)[::-1])
(906609, 913, 993)
这种情况适用于这种情况,因为对于现代计算机来说,元素的数量并不是很大。
但更酷的方法是从最大到最小逐个生成这些数字。那么最大值就是第一个:
def factors(n):
''' function to return the factors of a number '''
return set(reduce(list.__add__,
([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))
def pals(n, stop_n=0, length=3):
''' Generator to produce palindromes from largest to smallest '''
while n>stop_n:
if str(n)==str(n)[::-1]:
for f1 in factors(n):
f2=n//f1
if len(str(int(f1)))==length and len(str(int(f2)))==length:
yield n, f1, f2
n-=1
>>> next(pals(999*999))
(906609, 993, 913)
并且可以轻松地用于更大的数字(知道较大的数字可以长时间但具有纪念意义比生成所有数字更快):
>>> next(pals(99999*99999,length=5))
(9966006699, 99979, 99681)
>>> next(pals(999999*999999,length=6))
(999000000999, 999999, 999001)
答案 2 :(得分:0)
if语句应该在内部for循环中。
for i in range(100,1000):
for x in range(100,1000):
number = i*x
number = str(number)
if number==number[::-1]:
print(number)
print("DONE")