你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。
示例:
输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987
说明:
n 的取值范围为 [1,8]。
class Solution {
public int largestPalindrome(int n) {
/**
n位数乘n位数最大应该是2*n位数
那么就构建一个回文数(通过前两位进行构建),然后判断他是否能由两个n位数相乘得来
*/
long max=(long)(Math.pow(10,n)-1); //当前位数,能取到的最大值
long min=(long)(Math.pow(10,n-1));//当前位数,能取到的最小值
long cur=(long)(max*max/Math.pow(10,n)); //当前数从max开始,不断-- 最小是min
if(n==1){
return 9;
}
while(cur>=min){
long target=create(cur);
for(long i=max;i>=min;i--){
if(i*i<target){//一定要有,否则比99*99大的数产生 比如9889 这种情况发生
break;
}
if(target%i==0){
//说明可以由两位数想乘而得
return (int)(target%1337);
}
}
//没找到, cur-- 99->98->97
cur--;
}
return -1;
}
//根据当前数,生成回文串
public long create(long n){
StringBuilder sb=new StringBuilder(String.valueOf(n));
String str1=sb.toString();
String str2=sb.reverse().toString();
return Long.parseLong(str1+str2);
}
}