python中的回文数字

问题描述 投票:2回答:4

试图找到最大的回文,这是两个三位数的乘积。在我查找无限高效且更重要的工作解决方案之前,您能告诉我我的代码有什么问题吗?我只是继续得到空集。

def palindrome():
    n = 100
    m = 100
    palind = []
    while n<=999:
        while m<=999:
            prod = n * m
            if str(prod) == str(prod)[::-1] and prod > palind[0]:
                palind.pop(0)
                palind.append(prod)
            return palind
            m = m + 1
        n = n + 1
        return palind

print palindrome()
python palindrome
4个回答
3
投票

你有3个问题。

问题1:早点回归。

while n<=999:
    while m<=999:
        prod = n * m
        if str(prod) == str(prod)[::-1] and prod > palind[0]:
            palind.pop(0)
            palind.append(prod)
        # Here
        return palind
        m = m + 1
    n = n + 1
    # And here
    return palind

return语句意味着该功能已经结束。它停在原处,调用者获得返回值,调用者继续前进。在函数完成其工作之前,您不希望这样做。当函数完成计算时,让我们将return移动到循环之后。

问题2:palind[0]未初始化。

while n<=999:
    while m<=999:
        prod = n * m
        #                                           Here  v
        if str(prod) == str(prod)[::-1] and prod > palind[0]:
            palind.pop(0)
            palind.append(prod)
        m = m + 1
    n = n + 1
return palind

假设你的程序正在进行并找到它的第一个回文。它试图将它与palind[0]进行比较,但没有palind[0]!您需要采取第一个回文,而不是将其与不存在的回归进行比较。我们来解决这个问题。

问题3:不重置m

palind = None
while n<=999:
    while m<=999:
        prod = n * m
        if str(prod) == str(prod)[::-1]:
            if palind is None or prod > palind:
                palind = prod
        m = m + 1
    n = n + 1
return palind

n循环的第一次迭代之后,您需要使用m返回所有可能的n=101值。你不这样做;你的代码将m保留在1000,因此它不会再次通过内循环。您可以明确重置m,但使用for循环而不是whiles要容易得多。修复了所有3个问题,您的代码看起来像

palind = None
for n in xrange(100, 1000):
    for m in xrange(100, 1000):
        prod = n * m
        if str(prod) == str(prod)[::-1]:
            if palind is None or prod > palind:
                palind = prod
return palind

3
投票

这个快捷方式当不可能返回i * j>最大记录并正确返回906609时(注意,如果你在python 2中,下面对你有用,但是你更喜欢使用xrange而不是range来避免在内存中创建不必要的列表):

def palindrome(floor=0, upto=999):
    '''
    return the largest palindrome product for all number from (but not including)
    floor to (and including) upto 
    '''
    start = upto
    largest = None
    for i in range(start, floor, -1): # decreasing from upto
        if i * upto < largest: # if True, impossible for higher product from combo
            break 
        for j in range(start, i-1, -1): # decrease from upto to not including i-1
            product = i*j
            if str(product) == str(product)[::-1]:
                if product > largest:
                    largest = product
    return largest

用法:

>>> palindrome(99,999)
906609
>>> palindrome(10,13)
121
>>> palindrome(0,10)
9

短切是很重要的,因为如果给出一个非常大的数字,它可能需要很长时间才能返回:

>>> palindrome(upto=100000000)
9999000000009999L

我还创建了一个生成器,可以命中0到999之间的每个组合,并返回906609。

def palindrome(upto=1000):
    return max(i*j for i in range(upto) for j in range(upto) 
                if str(i*j) == str(i*j)[::-1])

但是当运行这个回文时,如:

>>> palindrome(upto=100000000)

完整搜索将搜索所有100000000 ^ 2,并且需要太长时间。

我第一次写这样的话,认为它会缩短并避免迭代所有可能的组合,但这是不正确的,它返回888888:

def palindrome():
    start = 999
    largest = 0
    for i in range(start, 0, -1): # decreasing from 999
        if i * 999 < largest:
            return largest
        for j in range(start, i, -1): # decreasing from 999 to i
            if str(i*j) == str(i*j)[::-1]:
                largest = i*j

它首先乘以999倍999倍,然后是998倍999倍

998*998
997*999
997*998
997*997
...

但结果并非单调递减(也就是说,每个结果都不能保证小于前一个结果。)


1
投票
  1. 在外部while循环的每次迭代之后,您不会重新初始化m = 100
  2. 你早点回来了。删除内循环中的return语句
  3. 最后一个return语句不应该在外部while循环中。
  4. 你从来没有初始化palind列表(感谢@ user2357112)

建议:

  1. 不要使用列表来保持最大数量。一个简单的变量就足够了。
  2. 您不必在同一表达式中将数字转换为字符串两次。将字符串化的数字存储在变量中。
  3. 使用range函数循环遍历数字

如果我要写这个程序,我会这样做的

from itertools import product
def palindrome():
    numbers, result = range(1000, 100, -1), -1
    for num1, num2 in product(numbers, repeat = 2):
        prod  = num1 * num2
        sprod = str(prod)
        if sprod == sprod[::-1] and prod > result:
            result = prod
    return result

print palindrome()   # 906609

0
投票

def isPalindrome(self,x:int):

temp = 0
x1 = x
while x > 0:
    y = x % 10
    temp = temp * 10 + y
    x = x//10

if(temp == x1):
    return True
else:
    return False

-1
投票

这可能无法回答问题,但是如果你想在范围之间获得回文数字,你可以这样做

def getPalindrome(lower, upper):
  listPalind = []
  for n in range(lower, upper):
    if str(n) == str(n)[::-1]:
      listPalind.append(n)
  return listPalind

# Usage
print(getPalindrome(100, 300))

# Results
[101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292]
© www.soinside.com 2019 - 2024. All rights reserved.