自己写的代码,没过AC,原因是 Submission Result: Time Limit Exceeded
class Solution {
public:
int largestPalindrome(int n) {
double max = pow(10,n)-1;
double min = max/10;
long temp = 0;
long p = max;
long q = max;
while(p>min)
{
q = p;
while(q>min)
{
long result = p*q;
if(result<temp)
{
if(p==q)
{
return temp%1337;
}
else
{
p--;
q = p;
continue;
}
}
long head = 0;
long tail = result;
while(tail)
{
head = head*10+tail%10;
tail/=10;
}
if(head == result)
{
temp = result;
}
q--;
}
p--;
}
return temp%1337;
}
};
具体思路是从n-digits最大的数(99999...9)去向下找乘积,找到最大的回文数。
p只会比《=自己的q相乘,当p=q且pq乘积已经小于现在最在的回文数时,直接return当前的回文数(也就是temp)。ps.%1337为题目中的要求。
翻过来思考,可以先找到最大的回文数,再检查能否被分解,如果不能就再找仅次于这个回文数的小回文数:
class Solution {
public:
int largestPalindrome(int n) {
if(n==1) return 9;
long left = pow(10,n)-2;
while (left > 0)
{
long t = left * pow(10, n);
long temp = t + reverse(left);
cout<<std::fixed<<(left * pow(10, n))<<"\t"<<temp<<endl;
for(long i = pow(10,n)-1; i*i>=temp; i--)
{
if(temp%i == 0 && (temp/i)<pow(10,n)-1)
{
return temp%1337;
}
}
left --;
}
}
long reverse(long num)
{
long rev = 0;
while(num)
{
rev = rev*10 + num%10;
num/=10;
}
cout<<"\t"<<rev<<"\t";
return rev;
}
};
结果AC,Runtime:448ms