60pts求调,玄关,用了高精的
查看原帖
60pts求调,玄关,用了高精的
562569
kingho11楼主2024/8/14 17:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4005;
string change(int x)
{
	string ans="";
	while(x)
	{
		ans.push_back((char)('0'+x%10));
		x/=10;
	}
	reverse(ans.begin(),ans.end());
	return ans;
}
string get(int cnt)
{
	return '('+change(cnt)+')';
}
string max_(string a,string b)
{
	if(a.length()>b.length())
	{
		return a;
	}else if(b.length()>a.length())
	{
		return b;
	}
	if(a>b)
	{
		return a;
	}else
	{
		return b;
	}
}
string sub(string a,string b)
{
	bool fl=false;
	if(max_(a,b)==b && a!=b)
	{
		fl=true;
		swap(a,b);
	}
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int lena=a.length(),lenb=b.length();
	while(lena<lenb)
	{
		a+='0';
		lena++;
	}
	while(lenb<lena)
	{
		b+='0';
		lenb++;
	}
//	cout<<a<<"\n"<<b<<"\n";
	int jiewei=0;
	string ans="";
	for(int i=0;i<lena;i++)
	{
		int c=a[i]-'0'-jiewei-(b[i]-'0');
		jiewei=0;
		if(c<0)
		{
			c+=10;
			jiewei=1;
		}
		ans+=(char)(c+'0');
	}
	reverse(ans.begin(),ans.end());
	bool b1=false;
	string anss="";
	for(int i=0;i<ans.length();i++)
	{
		if(!(!b1 && ans[i]=='0'))
		{
			b1=true;
			anss+=ans[i];
		}
	}
	if(fl)
	{
		anss='-'+anss;
	}
	if(anss=="")
	{
		anss="0";
	}
	return anss;
}
string add(string a,string b)
{
	bool flag=false;
	if(a[0]=='-' && b[0]!='-')
	{
		a.erase(0,1);
		return sub(b,a);
	}
	if(a[0]!='-' && b[0]=='-')
	{
		b.erase(0,1);
		return sub(a,b);
	}
	if(a[0]=='-' && b[0]=='-')
	{
		flag=true;
		a.erase(0,1);
		b.erase(0,1);
	}
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int lena=a.length(),lenb=b.length();
	while(lena<lenb)
	{
		a+='0';
		lena++;
	}
	while(lenb<lena)
	{
		b+='0';
		lenb++;
	}
	int c=0,jinwei=0;
	string ans="";
	for(int i=0;i<lena;i++)
	{
		c=a[i]-'0'+b[i]-'0'+jinwei;
		jinwei=0;
		if(c>=10)
		{
			c%=10;
			jinwei=1;
		}
		ans+=(char)(c+'0');
	}
	if(jinwei)
	{
		ans+='1';
	}
	if(flag)
	{
		ans+='-';
	}
	reverse(ans.begin(),ans.end());
	return ans;
}
int a[N],b[N],c[N];
string mul(string aa,string bb)
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	int lena=aa.length(),lenb=bb.length();
	for(int i=1;i<=lena;i++)
	{
		a[i]=aa[i-1]-'0'; 
	}
	for(int i=1;i<=lenb;i++)
	{
		b[i]=bb[i-1]-'0'; 
	}
	for(int i=lena;i>=1;i--)
	{
		for(int j=lenb;j>=1;j--)
		{
			c[i+j-1]+=a[i]*b[j];
		}
	}
	int len=lena+lenb-1;
	for(int i=len;i>=1;i--)
	{
		if(c[i]>=10)
		{
			c[i-1]+=c[i]/10;
			c[i]%=10;
		}
	}
	bool fl=false;
	string ans="";
	for(int i=0;i<=len;i++)
	{
		if(!(!fl && c[i]==0))
		{
			fl=true;
			ans+=c[i]+'0';
		}
	}
	if(!fl)
	{
		ans="0";
	}
	return ans;
}
signed main()
{
	string s;
	cin>>s;
	if(s[0]>='0' && s[0]<='9')
	{
		s='+'+s;
	}
//	s='+'+s;
	s+='#';
	bool flag=false;
	for(int i=0;i<s.length();i++)
	{
		if(s[i]==s[i+1] && !(s[i]>='0' && s[i]<='9'))
		{
			int cnt=1,op=i;
			char p=s[i];
			while(i<s.length())
			{
				if(s[i]==s[i+1])
				{
					cnt++;
					i++;
				}else
				{
					break;
				}
			}
			s.erase(op,cnt);
			s.insert(op,p+get(cnt));
		}
	}
//	cout<<s<<"\n";
	int fh=0;
	string xs="0",num="0",sum="0";
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='(')
		{
			flag=true;
		}else if(s[i]==')')
		{
			flag=false;
		}else if(s[i]>='0' && s[i]<='9')
		{
			if(flag)
			{
				xs=mul(xs,"10");
				string u="";
				u+=s[i];
//				cout<<s[i]<<"\n";
				xs=add(xs,u);
			}else
			{
				num=mul(num,"10");
				string u="";
				u+=s[i];
//				cout<<s[i]<<"\n";
				num=add(num,u);
			}
		}else
		{
			if(fh==0)
			{
				fh=(s[i]=='+'?1:-1);
				continue;
			}
			if(xs=="0")
			{
				xs="1";
			}
			if(fh==1)
			{
				sum=add(sum,mul(num,xs));
			}else
			{
//				cout<<num<<" "<<xs<<"\n";
				string p=mul(num,xs);
				p="-"+p;
//				cout<<p<<" "<<sum<<"\n";
				sum=add(sum,p);
			}
//			sum+=fh*num*xs;
			xs="0";
			fh=(s[i]=='+'?1:-1);
			num="0";
		}
//		cout<<fh<<" "<<xs<<" "<<num<<" "<<sum<<"\n"; 
	}
	cout<<sum;
}
2024/8/14 17:49
加载中...