高精度玄关求调
查看原帖
高精度玄关求调
717476
Gaochenxi103_QWQ楼主2024/5/2 22:02
#include<bits/stdc++.h>
using namespace std;
struct bigint{
	static const int N=1e3+10;
	int x[N]={0};
	bool op;
	int len =0;
	bigint()
	{
		memset(x,0,sizeof x);
		op=0;
		len=1;
	}
	bigint(string s)
	{
		memset(x,0,sizeof x);
		reverse(s.begin(),s.end());
		op=0;
		if(s.back()=='-')
		{
			op=1;
			s.pop_back();
		}
		if(s.back()=='+')
		{
			op=0;
			s.pop_back();
		}
		len=s.size();
		for(int i=0;i<len;i++)
		{
			x[i]=s[i]-'0';
		}
	}
	friend ostream& operator <<(ostream &os,bigint a)
	{
		if(a.op==1)os <<"-";
		for(int i=a.len-1;~i;i--)
		{
			os<<a.x[i];	
		} 
		return os;
	}
	friend bigint operator +(bigint a,bigint b)
	{
		bigint ans;
		ans.len=max(a.len,b.len)+1;
		if(a.op==1)
		{
			for(int i=0;i<=a.len;i++)
			{
				a.x[i]*=-1;
			} 
		}
		if(b.op==1)
		{
			for(int i=0;i<=b.len;i++)
			{
				b.x[i]*=-1;
			}
		}
		for(int i=0;i<ans.len;i++)
		{
			ans.x[i]+=a.x[i]+b.x[i];
			if(ans.x[i]>=10)
			{
				ans.x[i]-=10;
				ans.x[i+1]++;
			}
		}
		for(int i=0;i<ans.len;i++)
		{
			if(ans.x[i]<0)
			{
				while(ans.x[i]<0)
				{
					ans.x[i]+=10;
					ans.x[i+1]-=1;
				}
			}
		}
		for(int i=ans.len;i>0;i--)
		{
			if(ans.x[i-1]==0)
			{
				ans.len--;
			}else break;
		}
		if(ans.x[ans.len]<0)
		{
			ans.op=1;
			ans.len++;
			for(int i=0;i<=ans.len;i++)
			{
				ans.x[i]*=-1;
			}
		}
		for(int i=0;i<ans.len;i++)
		{
			if(ans.x[i]<0)
			{
				while(ans.x[i]<0)
				{
					ans.x[i]+=10;
					ans.x[i+1]-=1;
				}
			}
		}
		for(int i=ans.len;i>0;i--)
		{
			if(ans.x[i-1]==0)
			{
				ans.len--;
			}else break;
		}
		if(ans.len == 0)
		{
			ans.len ++; 
			return ans;
		}
		return ans;
	}
	friend bigint operator -(bigint a,bigint b)
	{
		bigint ans;
		b.op^=1;
		return a+b;
	}
	friend bigint operator *(bigint a,bigint b)
	{
		bigint ans;
		ans.len=a.len+b.len;
		if(a.op == b.op and a.op==1)
		{
			ans.op=1;
			ans.len++;
		}
		else
		{
			ans.op=0;  
		}
		for(int i=0;i<=b.len;i++)
		{
			for(int j=0;j<=a.len;j++)
			{
				ans.x[j]+=(a.x[j]*b.x[i]);
			}
		}
		for(int i=0;i<=ans.len;i++)
		{
			if(ans.x[i]>10)
			{
				ans.x[i+1]+=(ans.x[i]/10);
				ans.x[i]%=10;
			}
		}
		for(int i=ans.len;i>0;i--)
		{
			if(ans.x[i-1]==0)
			{
				ans.len--;
			}else break;
		}
		if(ans.len == 0)
		{
			ans.len ++; 
			return ans;
		}
		return ans;
	}
	friend bigint operator !(bigint n)//这里,阶乘出了问题,输入5,输出的是20.
	{
		bigint one;
		one.x[0]=1;
		one.len=1;
		if(n.len==1 && n.x[0]==0)
		{
			return one;
		} 
		bigint next=(n-one);
		return n*next;
	}
};
int main()
{
//	string a,b;
//	cin>>a>>b;
//	bigint x(a),y(b);
//	cout<<x+y<<"\n";
	string num;
	cin>>num;
    bigint x(num);
	cout<<!x;
	return 0; 
}
2024/5/2 22:02
加载中...