这是我的实现,但是给定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)
答案 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只是一个巧合,还是有规律?