题目内容:
两位整数相乘形成的最大回文数是 9009 = 99 × 91。编写程序,求得任意输入的 n 位整数相乘形成的最大回文数。
输入格式:
正整数 n
输出格式:
n 位整数相乘形成的最大回文数
输入样例:
2
输出样例:
9009
【基本思路】从大到小枚举可能的n位数因子,从中找到最大的回文数乘积。
【优化】试图缩小因子的取值范围,减少循环次数。
【分析】设两个因子分别为
i
i
i和
j
j
j,取
i
i
i等于因子可能的最大值
1
0
n
−
1
10^n-1
10n−1,从大到小枚举
j
j
j,一定可以找到回文数
N
N
N,设此时
j
=
j
0
j=j_0
j=j0。则
i
>
j
0
i>j_0
i>j0,
j
>
=
j
0
j>=j_0
j>=j0,否则
i
∗
j
<
N
i*j<N
i∗j<N,
i
∗
j
i*j
i∗j不可能是最大回文数。根据这个思路进行编程,代码如下:
def Is_palindrome(s): #判断回文数
l=len(s)
for i in range((l-1)//2+1):
if s[i]!=s[l-1-i]: return False
return True
def find(n):
base=10**n-1 #因子的基准值(从10^n-1开始减小)
for j in range(base,0,-1):
if Is_palindrome(str(base*j)):
max=base*j
mini=j #因子可能的最小值(如果i或者j小于mini的话,i*j一定小于base*mini)
break
for i in range(base,mini,-1):
for j in range(i,mini,-1):
if Is_palindrome(str(i*j)):
if i*j>max: max=i*j
return max
n=int(input())
print(find(n))