70分,3个RE
查看原帖
70分,3个RE
80882
MX_DMX楼主2022/11/15 10:28

求教 查了很久没看出来为什么字符串一长就会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值。

2022/11/15 10:28
加载中...