给定一个数字,我试图找到比给定数字更大的最小回文数。这是我的代码:
#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;
}
我的代码对我尝试过的所有输入都运行良好,但它没有被接受。我的代码是对的吗?
答案 0 :(得分:1)
此代码可能被拒绝的部分原因是:
O(n)
中解决,其中n
是数字的位数。我没有完全理解你的代码的工作方式 - 说实话,我不会付出任何努力来理解那些混乱 - 但这并不完全看起来是线性的(甚至接近它) #include <bits/stdc++.h>
:此标头是GNU特定的,特定于编译器的,....如果测试人员使用其他编译器,则此代码甚至可能无法编译除此之外,编译需要更多时间使用此标头,并且将生成比您只需包含所需标头更大的可执行文件。我们以更广泛的方式描述here使用此标头的不好主意的原因。我只能推测解决方案真正被拒绝的原因。回答这个问题所需的最少信息将是拒绝它的法官的链接 - 这应该提供一个理由为什么它被拒绝。