最大回文集,是两个n位数字的乘积(Python)

时间:2018-12-04 01:52:30

标签: python palindrome

这是我的实现,但是给定6位数字时效率不高。

Input  : n = 2
Output : 9009 

9009是最大的数字,是2的乘积

2位数字。 9009 = 91 * 99。

def isPali(x):
n = str(x)
for i in range(len(n)):
    if not n[i] == n[-i-1]:
        return False
return True

def isProduct(x,A):
counter = A
while counter > 1:
    if x // counter <= A and x % counter == 0:
        return True
    else:
        counter-=1
return False

def largestProduct(A):
for i in range(A*A,1,-1):
    if isPali(i) and isProduct(i,A):
        return i
return False

largestProduct(999999)

2 个答案:

答案 0 :(得分:1)

让x和y是回文数的两个n位因子。

您可以用降序遍历它们。

关键是要尽快停止,这意味着一旦找到第一个解决方案,您就不会检查该解决方案下方的任何产品。

def get_max_palindrome(n):
    res = 0
    for x in range(10 ** n - 1, 1, -1):
        for y in range(10 ** n - 1, 1, -1):
            p = x * y
            if res > p:
                break
            if str(p) == str(p)[::-1]:
                res = p
                break
        if (x - 1) ** 2 < res:
            break
    return res


print(get_max_palindrome(6))

在笔记本电脑上以0.378s执行。

答案 1 :(得分:0)

按代码排列,这并不难:

    n = 999999
    max_pali =0
    t = ()
    for i in range(1,n+1):
        for j in range(i,n+1):
            m = i*j
            s = str(m)
            if s == s[::-1] and m > max_pali:
                max_pali = m
                t = (i,j)
    print(max_pali,t)

但是,这是一种蛮力方法。对于6位数字,这不会在合理的时间内终止。即使可以,我也可以问您同样的7位或42位数字问题。我建议您寻找这些数字的某些结构或性质,其倍数是回文。这样的一对可以是任何一对数字吗? 91 * 99 = 9009只是一个巧合,还是有规律?