下一个回文的时间限制超过了

时间:2015-09-03 12:18:29

标签: c

给出一个数字,我很想找到下一个是回文的数字。这是我写的代码。我的代码工作正常,但我正在处理的网站上说超过时间限制" ...我该怎么纠正这个?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


#define MAXLEN 50

void reverse (char s[]){

int c,i,j;

for (i=0,j=strlen(s)-1;i<j;i++,j--){
   c= s[i];
   s[i]=s[j];
   s[j]=c;
  }
}

void itoa (int n, char s[]) {

  int i;
  i = 0;
  do {
     s[i++] = n % 10 + '0'; 
     } while ((n /= 10) > 0); 
     s[i] = '\0';
     reverse(s);
}

  int main (void) {

  int t,j;
  scanf("%d",&t);

  for(j=0;j<t;j++){
     int k,c=1,i;
     char s[MAXLEN];
     scanf("%d",&k);
     int a= k+1;
     while (c!=0){
         itoa(a,s);
         int e=strlen(s)-1;
         for(i=0;i<(e+1)/2;i++){
             if (s[i]==s[e-i]){
                 c=0;
             }
             else{
                 c=1;
                 goto state;
             } 
         }
         state:a++;
    }

    printf("%s\n",s);
    }

  return 0;
}

1 个答案:

答案 0 :(得分:1)

你需要使用比蛮力更聪明的方法!

这是一个具有时间复杂度log(N)的算法:

将数字作为字符串读取。

取数字的前半部分。 通过添加前半部分使其成为回文。 (考虑两种情况:原始数字的偶数/奇数长度)

如果此回文大于原始数字,则表示已完成。

如果不是: 取数字的前半部分并添加1.

通过添加前半部分来制作回文。 (再次考虑两种情况:原始数字的偶数/奇数长度。)

完成!