C 超出了下一回文的时间限制

C 超出了下一回文的时间限制,c,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]

给定一个数字,我必须找到下一个回文数字。这是我写的代码。我的代码运行良好,但我正在工作的网站上说“超过了时间限制”…我如何纠正这一点

#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;
}
#包括
#包括
#包括
#定义MAXLEN 50
无效反向(字符s[]){
int c,i,j;
对于(i=0,j=strlen(s)-1;i0);
s[i]='\0';
反面;
}
内部主(空){
int t,j;
scanf(“%d”、&t);

对于(j=0;j你需要使用比暴力更聪明的方法

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

以字符串形式读取数字

拿数字的前半部分。 将前半个倒数相加,形成回文。(考虑两种情况:原始数字的偶数/奇数长度)

如果此回文数大于原始数,则完成此操作

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

将前半部分倒置为回文。(再考虑两种情况:原始数的偶数/奇数)。< /P>


完成了!

反向
中的
for
-循环中是否应该是
j--
?如果数字是一个字符串,那么简单地从两端迭代字符串并比较第一个和最后一个,直到迭代器相遇,不是会快得多吗?但是如果它是一个字符串,我如何增加数字呢?@al27一种方法是首先将它转换为一个字符串整数类型,添加1,然后将其转换回字符串。@Lundin确实,这会更快,但它找不到下一个回文数字。