你需要找到由两个 n 位数的乘积组成的最大回文数。
由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。
示例:
输入: 2
输出: 987
解释: 99 x 91 = 9009, 9009 % 1337 = 987
说明:
n 的取值范围为 [1,8]。
代码
这道题很明显如果通过暴力求解会超时,只有进一步的进行循环判断才能达到要求
但是一般使用的是long类型,如果将底下的x换成int型那么会出错
一个long类型除以int型会将int型向上转
class Solution {
public static int largestPalindrome(int n) {
if (n == 1) {
return 9;
}else {
int upper = (int) Math.pow(10, n)-1;
int lower = upper / 10;
for(int i = upper; i > lower; i--){
long is = re(i);
for (**long x = upper;** x * x >= is; x--) {//如果将x类型换成int会出错
if(is % x == 0){
return (int) (is % 1337);
}
}
}
return 0;
}
}
public static long re(int i){
StringBuffer s=new StringBuffer();
s.append(Integer.toString(i)).reverse();
return Long.parseLong(i+s.toString());
}
}
public static int largestPalindrome(int n) {
if(n==1)
return 9;
int maxNumber=(int)Math.pow(10,n)-1;
for(int i=maxNumber;i>maxNumber/10;i--){//从大到小遍历n位数
long num=palindrome(i);//构造回文
for(long j=maxNumber;j*j>=num;j--){//判断num是否可以分解为两个n位数相乘
if(num%j==0)
return (int)(num%1337);
}
}
return 0;
}
public long palindrome(int i){
StringBuffer s=new StringBuffer();
s.append(Integer.toString(i)).reverse();
return Long.parseLong(i+s.toString());
}
排名靠前的都是将八个测试用例都写进去的玩意,真是鸡贼啊,哈哈哈~~~