可以进一步减少此代码的时间复杂度吗?

时间:2016-06-04 08:49:11

标签: c++ algorithm performance c++11

我遇到了编程挑战的几个测试用例的超时。任何帮助将不胜感激。

这是练习:

  

回文数字两种方式相同。由两个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;
}

2 个答案:

答案 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;
}