我遇到了编程挑战的几个测试用例的超时。任何帮助将不胜感激。
这是练习:
回文数字两种方式相同。由两个3位数字的乘积组成的最小的6位数回文是
101101 = 143 * 707
。查找由两个3位数字的乘积制成的最大回文,其小于
N
(任何大于101101
且小于1000000
的输入。)
我拥有的是:
#include<bits/stdc++.h>
using namespace std;
bool check_palindrome(unsigned int a)
{
unsigned int temp = a;
unsigned int digit ; //used for reversing
unsigned int rev_a = 0; //final reversed number
int power = 5; //used for reversing
unsigned int modulo; //used for reversing
while(temp > 0)
{
digit = temp / int(pow(10,power));
temp = temp % int(pow(10 , power));
rev_a = rev_a + digit * (pow(10 , 5 - power));
power--;
}
return (a == rev_a) ? true : false ;
}
int main()
{
int T;
unsigned int n;
scanf("%d" , &T);
for(int i = 0 ; i < T ; i++) //for entering number of test cases
{
unsigned int max_palindrome=0;
scanf("%d" , &n); //Input the number
for(int p = 101 ; p <= 999 ; p++)
{
int m ;
int other_number = int(n/p);
if(other_number > 999 )
m = 999;
else
m = other_number;
for( int q = m ; q >100 ; q--)
{
if( p*q < 101101)
break;
bool palindrome = check_palindrome(p*q);
if(palindrome)
{
if(p*q > max_palindrome)
max_palindrome = p*q;
break;
}
}
}
printf("%d\n" , max_palindrome);
}
return 0;
}
答案 0 :(得分:0)
不是尝试所有合理的因素,而是从给定的数字开始并倒计时。每次你得到一个回文数字,看看它是否可以表示为合适的产品(检查从sqrt(palindrome)
到101的所有可能因素。)
优势在于,只要找到合适的回文,就不必继续搜索。
编辑:你甚至不需要搜索回文,你可以通过完成所有可能的前半部分并计算相应的后半部分来枚举它们。
答案 1 :(得分:0)
正如@AlanStokes所说,你需要检查的价值超出你的需要。此外,这是一个更合理的回文检查。
bool is_palindrome(unsigned n) {
unsigned rn = 0;
for (unsigned x = n; x; x /= 10)
rn = 10 * rn + x % 10;
return rn == n;
}