最大的Palindrome产品有2个3位数字

时间:2016-01-02 16:59:31

标签: python python-3.x

问题陈述:

回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。

找出由两个3位数字的乘积制成的最大回文。

这就是我所做的。

for x in range(999,100,-1):
    for y in range(x,100,-1):
    check = str(x*y)

    check_length = len(check)

    if check_length % 2 == 0:
        if check[0:check_length//2] ==  check[check_length:check_length//2:-1]:
            print(check)
            break

所以我删除了所有重复产品(即999x998 = 998x999),将其转换为字符串,并在反转第二个字符串后检查两半是否相同。这不会产生任何结果。我不是在寻找答案,而是寻找方向的暗示,并指出代码的任何问题。谢谢!

修改

for x in range(999,100,-1):
    for y in range(x,100,-1):
    check = str(x*y)

    check_length = len(check)

    if check[0:check_length//2] ==  check[check_length:check_length//2:-1]:
        print(check)
        break

检查的样本输出

580085

906609

119911

282282

853358

修改

这是我的最终版本。感谢您的所有投入。

largest_palindrome = 0

 for x in range(999,100,-1):
     for y in range(x,100,-1):
        product = x*y
        check = str(x*y)

        if check ==  check[::-1]:
            if product > largest_palindrome:
                largest_palindrome = product

print(largest_palindrome)

2 个答案:

答案 0 :(得分:2)

你的支票错了。我们来看一个例子:

>>> check = '123321'
>>> check_length = len(check)
>>> check[0:check_length//2]
'123'
>>> check[check_length:check_length//2:-1]
'12'

正如你所看到的,你正在砍掉一个角色。那是因为您将字符串拆分为check[6:3:-1],这使得索引3保持不变(因为范围不包括结尾)。所以正确如下:

>>> check[check_length:check_length//2 - 1:-1]
'123'

但实际上你并不需要这种复杂性。没有必要将字符串分成两半并比较两半。回文是一个向前读取相同向后的字符串。所以只需将整个字符串与反向的整个字符串进行比较:

>>> check
'123321'
>>> check[::-1]
'123321'
>>> check == check[::-1]
True

这也很容易检查一个你完全不考虑的案例:字符串长度不均匀。数字12321也是一个回文,但由于字符串长度是5,你完全忽略它。

最后,您的代码还有两个问题:

    内部循环中的
  1. break不会破坏外部循环。因此,您将停止迭代y,但x的下一次迭代将开始,因此您将继续搜索一段时间。在这种情况下,您还需要一种方法来打破外部循环。
  2. 您不是在寻找最大的回文。您只是从最大的参数x开始,然后检查所有可能产生回文的y。但是这会给你举例998 * 583作为最大的回文,但是很容易产生数量(低x)会产生更大的回文。所以你应该检查你找到的所有回文,或者用另一种方式进行迭代。

答案 1 :(得分:1)

def reverse(n):
    Number = n    
    Reverse = 0    
    while(Number > 0):    
        Reminder = Number %10    
        Reverse = (Reverse *10) + Reminder    
        Number = Number //10      
    return Reverse

def multiple(i, j):
    return i * j



def checkPalindrone(n, rn):
    if (n == rn):
        return True
    else:
        return False
def maxPalindrone():
    mult = 0
    returnPalidrone = []
    for i in range(100,1000):
        for j in range(100,1000):
            mult = multiple(i,j)
            if (checkPalindrone(mult, reverse(mult))):
                returnPalidrone.append(mult)
            else:
                continue
    return max(returnPalidrone)
相关问题