在 python 中反转转换后的字符串
Reversing a converted string in python
我想求出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")
它什么都不做,只是打印完成。
我已将数字转换为字符串并完成了 slice 事情但没有工作......只是打印 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))
但还是不行...
如何修复?
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")
关于代码
你应该检查 每个 数字,所以你的 if 语句应该在循环中。
这就是代码的全部内容。
性能
为了更快地检查,您可以从最大的数字开始检查,然后向下检查。
示例:for i in range(999, 99, -1)
.
你在这里使用了 999,因为左边是 INCLUSIVE,但右边的阈值不是。
下一步是优化内循环。您不需要检查每个值。只需从 999 循环到 i 以进行最佳检查。
使用此算法,您的代码将找到最大的回文数,而无需检查 versive x 和 i 顺序。
在您的代码中,它可能会检查 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
范围内为步长。所以负面的一步是向下到第二个数字
我假设你正在研究 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)
在这种情况下可行,因为元素的绝对数量对于现代计算机来说并不是那么多。
但是一个更酷的方法是从大到小一个一个地生成这些数字。那么max就是第一个:
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个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")
它什么都不做,只是打印完成。 我已将数字转换为字符串并完成了 slice 事情但没有工作......只是打印 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))
但还是不行... 如何修复?
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")
关于代码
你应该检查 每个 数字,所以你的 if 语句应该在循环中。
这就是代码的全部内容。
性能
为了更快地检查,您可以从最大的数字开始检查,然后向下检查。
示例:for i in range(999, 99, -1)
.
你在这里使用了 999,因为左边是 INCLUSIVE,但右边的阈值不是。
下一步是优化内循环。您不需要检查每个值。只需从 999 循环到 i 以进行最佳检查。
使用此算法,您的代码将找到最大的回文数,而无需检查 versive x 和 i 顺序。
在您的代码中,它可能会检查 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
范围内为步长。所以负面的一步是向下到第二个数字
我假设你正在研究 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)
在这种情况下可行,因为元素的绝对数量对于现代计算机来说并不是那么多。
但是一个更酷的方法是从大到小一个一个地生成这些数字。那么max就是第一个:
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)