在python中反转转换后的字符串

时间:2017-01-31 20:10:57

标签: 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")

它什么都不做,只打印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))

但它仍然不起作用...... 怎么解决?

3 个答案:

答案 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")