给出一个数字,我很想找到下一个是回文的数字。这是我写的代码。我的代码工作正常,但我正在处理的网站上说超过时间限制" ...我该怎么纠正这个?
#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;
}
答案 0 :(得分:1)
你需要使用比蛮力更聪明的方法!
这是一个具有时间复杂度log(N)的算法:
将数字作为字符串读取。
取数字的前半部分。 通过添加前半部分使其成为回文。 (考虑两种情况:原始数字的偶数/奇数长度)
如果此回文大于原始数字,则表示已完成。
如果不是: 取数字的前半部分并添加1.
通过添加前半部分来制作回文。 (再次考虑两种情况:原始数字的偶数/奇数长度。)
完成!