题目
你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。
示例
输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987
说明:
n 的取值范围为 [1,8]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-palindrome-product
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:模拟
从大到小依次构造回文串。
2位数的情况:
最大值为 99x99 = 9801(4位)
4位的回文数有:9889、9779、9669、9559……(从大到小)
如何判断构造的4位回文数是否可以由2位数相乘得到呢?
用回文数 % 除数==0
Python实现
class Solution:
def largestPalindrome(self, n: int) -> int:
res=""
if n==1:
return(9)
maxnum=10**n-1 //找最大值
i=maxnum-1
while(i>maxnum/10):
res=str(i)+str(i)[::-1] //构造回文数,从98开始。因为max*max必不是回文数
flag=maxnum //构造除数,从99开始
//判断回文数
while(flag*flag>=int(res)):
if int(res)%flag==0:
return(int(res)%1337)
else:
flag-=1
i-=1
Java实现
class Solution {
public int largestPalindrome(int n) {
if (n == 1) return 9;
int upper = (int)Math.pow(10, n) - 1;
for (int i = upper; i >= 0; i--) {
//翻转左半部分到其自身末尾,构造回文数num
long num = i, var = i;
while (var != 0) {
num = num * 10 + (var % 10);
var /= 10;
}
for (long j = upper; j * j >= num; j--) {
if (num % j == 0) return (int)(num % 1337);
}
}
return -1;
}
}