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确实,这会更快,但它找不到下一个回文数字。