寻找下一个回文
Posted
技术标签:
【中文标题】寻找下一个回文【英文标题】:Find the next palindrome 【发布时间】:2016-01-31 19:54:18 【问题描述】:给定一个数字,我试图找到大于给定数字的最小回文数。这是我的代码:
#include<bits/stdc++.h>
using namespace std;
char a[1000005];
int main()
int t,len,ni,nj,nk,i,j,k;
cin>>t;
while(t--)
cin>>a;
char ch=getchar();
len=strlen(a);
k=len-1;
for(i=0;i<len;i++)
if(a[i]!='9')
break;
if(i==len) //if all digits are 9
for(i=len-1;i>0;i--)
a[i]='0';
a[0]='1';
a[len]='1';
a[len+1]='\0';
else
for(i=0;i<len/2;i++)
if(a[i]!=a[len-1-i]) //check if number is already palindrome
break;
if(i==len/2) //add 1 if it is already palindrome
j=len-1;
while(1)
nj=((int)a[j])-48;
nj++;
if(nj<10)
a[j]=nj+48;
break;
else
a[j]=48;
j--;
for(i=0;i<len/2;i++)
if(a[i]==a[k]) //compare first with last,second with second last...
k--;
else
nk=((int)a[k])-48;
ni=((int)a[i])-48;
if(nk<ni)
a[k]=ni+48;
else
j=k; a[j]=ni+48; j--;
while(1)
nj=((int)a[j])-48;
nj++;
if(nj<10)
a[j]=nj+48;
break;
else
a[j]=48;
j--;
if(j<=i)
i=j-1;
k=len-j;
k--;
if(len%2==0)
a[len/2]=a[len/2-1];
cout<<a<<endl;
return 0;
我的代码对于我尝试过的所有输入都运行良好,但它没有被接受。我的代码对吗?
【问题讨论】:
这么简单的任务有很多代码,您很可能应该考虑另一种方法。并且不要包含stdc++
(***.com/questions/31816095/…)。实际上,如果它有效,这甚至可能是它不被接受的原因。更有意义的变量名会让这更容易理解。
请给法官链接好吗?
法官给出的结果是什么?
是 WA 还是任何其他(运行时)错误?
它显示的是 WA。问题是spoj.com/problems/PALIN
【参考方案1】:
此代码可能被拒绝的一些原因是:
代码长度:找到大于给定输入的最小回文数可以用大量更少的代码来完成。 内存效率:对于可以轻松就地完成的操作来说,~1MB 的内存实在是太多了。所需的总内存只是数字的大小加上一些额外的整数变量。 运行时效率:这个问题可以在O(n)
中解决,其中n
是数字的位数。我不太明白你的代码的工作方式——老实说,我不会花任何精力去理解这种混乱——但这看起来并不完全是线性的(甚至不接近线性)。
#include <bits/stdc++.h>
: 这个头文件是 GNU 特定的,编译器特定的,...。如果测试人员使用其他编译器,此代码甚至可能无法编译。除此之外,与仅包含所需的头文件相比,编译此头文件需要更多时间,并且会产生更大的可执行文件。 here 以更广泛的方式描述了使用此标头是一个坏主意的原因。
我只能推测解决方案确实被拒绝的原因。回答这个问题所需的最少信息是指向拒绝它的法官的链接 - 这也应该给出一个为什么它被拒绝的原因。
【讨论】:
你提到的原因无关紧要。 1. 代码长度不大,完全在文件大小限制之下。 2.正如代码所示,输入的数字不是整数而是字符串,用户输入为char[],即。输入的位数必须在 10^6 左右。 3. 他的解决方案的运行时效率是 O(n)。你自己看。 4. 不包含此头文件的原因有很多,但在我了解它的缺点之前,我的许多解决方案已被许多在线评委接受。 @vish4071 正如我在最后所说的:这只是推测。 OP 甚至没有提供法官或任务本身的链接,因此这些只是猜测。至于第 2 点,与 OP 的问题相同:信息太少,只是一个猜测。第3点:是的,你是对的。我只是对那一堆乱七八糟的变量和循环感到有些困惑。第 4 点:正如我所说,这取决于法官政策及其编译器。 终于被录取了。我在代码中删除了显式类型转换,因为它们是不必要的,并直接比较了数组元素。也许,这就是问题所在。感谢您的回答。以上是关于寻找下一个回文的主要内容,如果未能解决你的问题,请参考以下文章