求教 查了很久没看出来为什么字符串一长就会RE
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
#define test 1
string n,s1;
ll l;
bool big()
{
bool big=0;
ll l1=0;
for(ll i=0;s1[i];i++)
{
l1++;
if(s1[i]=='\0') break;
}
if(l1>l)return 1;
if(l1<l) return 0;
for(ll i=0;i<l;i++)
{
if(s1[i]>n[i])
{
big=1;
break;
}
if(s1[i]<n[i])
{
big=0;
break;
}
}
return big;
}
int main()
{
cin>>n;
l=n.length();
//43->44 433->434第一次构造,不修改任何位
for(ll i=0;i<=(l-1)/2;i++)//2->[0,1]->0 3->[0,2]->1
{
s1[i]=n[i];
s1[l-1-i]=n[i];
}
s1[l]='\0';
if(big())
{
#if test
cout<<"case1"<<endl;
#endif
for(ll i=0;i<l;i++)
{
cout<<s1[i];
#if test
cout<<"i="<<i<<endl;
#endif
}
return 0;
}
//45->44(X) ->55 819->818(X)->828 1993->1991(X)->2002 最后一位+1,前面转化为合法十进制数
string n1=n;
ll tmp=(l-1)/2;
n1[tmp]++;
bool ok=1;
while(n1[tmp]>'9')//越界
{
if(tmp==0)
{
ok=n1[tmp]<'9';
break;
}
n1[tmp]-=10;
n1[tmp-1]++;
tmp--;
}
if(ok)
{
for(ll i=0;i<=(l-1)/2;i++)
{
s1[i]=n1[i];
s1[l-1-i]=n1[i];
}
s1[l]='\0';
if(big())
{
#if test
cout<<"case2"<<endl;
#endif
for(ll i=0;i<l;i++)
{
cout<<s1[i];
//if(s1[i]==0)break;
}return 0;
}
}
//第三部分,涉及进位 99->101 有标志 ok=0
string n2;
n2[0]='0';//imp
for(ll i=0;i<l;i++)
{
n2[i+1]=n[i];
}
tmp=(l)/2;//l,tmp 4,2 5,3 3,2 2,1 1,1
n2[tmp]++;
while(n2[tmp]>'9')//越界
{
n2[tmp]-=10;
n2[tmp-1]++;
tmp--;
}
for(ll i=0;i<=l/2;i++)//99 2wei ->2->3wei->01 ->1 \3->4->1 4->5->2
{
s1[i]=n2[i];
s1[l-i]=n2[i];
}
//s1[l]='\0';
if(big())
{
#if test
cout<<"case3"<<endl;
#endif
for(ll i=0;i<=l;i++)
{
cout<<s1[i];
}
return 0;
}
}
比如1263789613274971
能输出正确答案,但程序不会正常终止,会在很久后返回一个非0值。