在python中反转已转换的字符串
我想找出2个3位数的最大回文乘积。 这是我的代码:在python中反转已转换的字符串,python,string,python-3.x,reverse,Python,String,Python 3.x,Reverse,我想找出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") 它什么也不做,只是完成了打印。 我已将数字转换为字符串,并执行了切片操作,但不起作用。。。刚印好。 我
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")
它什么也不做,只是完成了打印。
我已将数字转换为字符串,并执行了切片操作,但不起作用。。。刚印好。
我该如何解决这个问题
编辑
我想把回文放在一个列表中,并按大小排序
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))
mylist=[]
对于范围(999,99,-1)内的i:
对于范围(999,i-1,-1,)内的x:
数字=i*x
编号=str(编号)
如果数字==数字[:-1]:
打印(数字)
mylist.append(编号)
mylist=已排序(mylist)
打印(“完成”)
对于mylist中的i:
对于mylist中的x:
if int(i)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循环中
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语句就应该在一个循环中
这都是关于代码的
演出
为了更快地检查,您可以从最大的数字开始检查,然后向下检查
示例:用于范围(999,99,-1)内的i
U在这里使用999,因为左侧包含,但右侧阈值不包含
下一步是优化内部循环。您不需要检查每个值。只需从999循环到i,以进行最佳检查
使用此alghoritm,您的代码将找到最大的回文数,而无需检查x和i顺序
在您的代码中,它可能会检查30/70,然后检查70/30,例如
固定代码
-1
范围内为步进。所以负一步是向下到第二个数字关于代码
您应该检查每个数字,这样您的if语句就应该在一个循环中
这都是关于代码的
演出
为了更快地检查,您可以从最大的数字开始检查,然后向下检查
示例:用于范围(999,99,-1)内的i
U在这里使用999,因为左侧包含,但右侧阈值不包含
下一步是优化内部循环。您不需要检查每个值。只需从999循环到i,以进行最佳检查
使用此alghoritm,您的代码将找到最大的回文数,而无需检查x和i顺序
在您的代码中,它可能会检查30/70,然后检查70/30,例如
固定代码
-1
范围内为步进。所以负一步,它向下移动到第二个数字,我想你正在工作
您可以使用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)
并且可以很容易地用于较大的数字(知道较大的数字可能需要很长时间,但比生成所有数字要快得多):
我想你是在工作
您可以使用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)
并且可以很容易地用于较大的数字(知道较大的数字可能需要很长时间,但比生成所有数字要快得多):
小心你的压痕。您的if
回文检查发生在…
循环中x的完成之后。@Adam Smith thx,没有看到!那么我想我也必须缩进打印语句?注意缩进。您的if
回文检查发生在…
循环中x的完成之后。@Adam Smith thx,没有看到!那么我想我也必须缩进打印语句?对不起,我,不是y。在Phone上键入很困难此算法在第一次出现时不会找到最大回文。它会在913*993=906609
之前找到(例如)924*962=8888888
,因为在检查993
时,它不会循环到913
是的,让我们再减去一些。。。我们懂数学,所以不会那么难。。。但是好的,它更快。现在这只是一个加号(只检查唯一值)@MauriceMeyer i不需要定义,因为我们只是用它来迭代Pardon,i,而不是y。在Phone上键入很困难此算法在第一次出现时不会找到最大回文。它会在913*993=906609
之前找到(例如)924*962=8888888
,因为在检查993
时,它不会循环到913
是的,让我们再减去一些。。。我们懂数学,所以不会那么难。。。但是好的,它更快。这是目前唯一的优点(只检查唯一值)@MauriceMeyer i不需要定义,因为我们只是使用它来迭代