C++高精度完整版

#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
using namespace std;
const int rw[]={-1,0,1,0,-1,1,-1,1},cl[]={0,1,0,-1,-1,1,1,-1};
const int N=10001,inf=0x3f3f3f3f;
struct number{
	int len,num[N];
	bool isfu;
	number & operator = (const char*);
	number & operator = (int);
	number();
	number(int);
	bool operator > (const number &) const;
	bool operator < (const number &) const;
	bool operator >= (const number &) const;
	bool operator <= (const number &) const;
	bool operator != (const number &) const;
	bool operator == (const number &) const;
	number operator + (const number &) const;
	number operator - (const number &) const;
	number operator * (const number &) const;
	number operator / (const number &) const;
	number operator % (const number &) const;
	number operator += (const number &);
	number operator -= (const number &);
	number operator *= (const number &);
	number operator /= ( number &);
	number operator %= ( number &);
	number operator ++ ();
	number operator -- ();
};
void deletezero(number &p){
	while(p.num[p.len]==0&&p.len>1) p.len--;
	if(p.len==1&&p.num[1]==0&&p.isfu) p.isfu=0;
}
number abs(number p){
	number k=p;
	k.isfu=0;
	return k;	
}
number & number::operator = (const char* c){
	ms(num,0);
	int n=strlen(c),j=1,k=1;
	if(c[0]=='-'){
		isfu=1;
		fs(i,2,n,1){
			if(k>=10000){
				j++;
				k=1;
			} 
			num[j]+=k*(c[n-i+1]-'0');
			k*=10;
		}
		len=j;
		deletezero(*this);
		return *this;
	}
	fs(i,1,n,1){
		if(k>=10000){
			j++;
			k=1;
		} 
		num[j]+=k*(c[n-i]-'0');
		k*=10;
	}
	len=j;
	deletezero(*this);
	return *this;
}
number & number::operator = (int p){
	char s[N];
	sprintf(s,"%d",p);
	return *this=s;
}
number::number(){
	ms(num,0);
	len=1;
	isfu=0;
}
number::number(int p){
	*this=p;
}
bool number::operator > (const number &b) const{
	if(isfu&&b.isfu==0) return 0;
	if(isfu==0&&b.isfu) return 1;
	bool w=!isfu;
	if(len!=b.len) return (len>b.len)*w;
	ft(i,len,1,-1){
		if(num[i]!=b.num[i]) return (num[i]>b.num[i])*w;
	}
	return 0;
}
bool number::operator < (const number &b) const{
	return b>*this;
}
bool number::operator <= (const number &b) const{
	return !(*this>b);
}
bool number::operator >= (const number &b) const{
	return !(b>*this);
}
bool number::operator != (const number &b) const{
	return (b>*this)||(*this>b);
}
bool number::operator == (const number &b) const{
	return !(*this>b)&&!(b>*this);
}
ostream & operator << (ostream &o,number p){
	if(p.isfu) o<<'-';
	o<<p.num[p.len];
	ft(i,p.len-1,1,-1){
		o.width(4);
		o.fill('0');
		o<<p.num[i];
	}
	return o;
}
istream & operator >> (istream &x,number &p){
	char s[N];
	x>>s;
	p=s;
	return x;
}
number number::operator + (const number &b) const{
	number c,a=*this;
	if(isfu&&b.isfu==0){
		//if(b<abs(a)){
			number k=abs(a);
			if(b>=k) c=b-k;
			else c=k-b;
			if(b<abs(a)) c.isfu=1;
			deletezero(c);
			return c;
		//}
	}else if(isfu==0&&b.isfu){
		//if(a<abs(b)){
			number k=abs(b);
			if(a>=k) c=a-k;
			else c=k-a;
			if(a<abs(b)) c.isfu=1;
			deletezero(c);
			return c;
		//}
	}
	c.len=max(len,b.len);
	fs(i,1,c.len,1){
		c.num[i]+=num[i]+b.num[i];
		if(c.num[i]>=10000){
			c.num[i]-=10000;
			c.num[i+1]++;
		}
	}
	if(c.num[c.len+1]>0) c.len++;
	deletezero(c);
	c.isfu=isfu;
	return c;
}
number number::operator - (const number &b) const{
	number c,a=*this;
	if(isfu==0&&b.isfu==0&&a<b){
		c=b-a;
		c.isfu=1;
		return c;
	}else if(isfu&&b.isfu==0){
		number k=abs(a);
		c=k+b;
		c.isfu=1;
		return c;
	}else if(isfu==0&&b.isfu){
		return a+abs(b);
	}else if(isfu&&b.isfu){
		c=abs(b)-abs(a);
		//c.isfu=1;
		return c;
	}
	c.len=len;
	fs(i,1,c.len,1){
		c.num[i]+=num[i]-b.num[i];
		if(c.num[i]<0){
			c.num[i]+=10000;
			c.num[i+1]--;
		}
	}
	deletezero(c);
	return c;
}
number number::operator += (const number &b) {
	return *this=*this+b;
}
number number::operator -= (const number &b) {
	return *this=*this-b;
}
number number::operator ++ () {
	return *this=*this+1;
}
number number::operator -- () {
	return *this=*this-1;
}
number number::operator * (const number &b) const{
	number c;
	if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
	else c.isfu=0;
	c.len=len+b.len+1;
	fs(i,1,len,1){
		fs(j,1,b.len,1){
			c.num[i+j-1]+=num[i]*b.num[j];
			c.num[i+j]+=c.num[i+j-1]/10000;
			c.num[i+j-1]%=10000;
		}
		
	}
	deletezero(c);
	return c;
}
number number::operator *= (const number &b) {
	return *this=(*this)*b;
}
number number::operator / (const number &b) const{
	number c,d;
	if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
	else c.isfu=0;
	c.len=len+b.len+1;d.len=0;
	ft(i,len,1,-1){
		memmove(d.num+2,d.num+1,sz(d.num)-sz(int)*2);
		d.len++;
		d.num[1]=num[i];
     int l=0,r=9999,m;
		while(l<r){
			m=(l+r)/2;
			if((b*number(m))<=d) l=m+1;
			else r=m;
		}
     c.num[i]=r-1;
     d=d-b*number(r-1);
	}
	deletezero(c);
	return c;
}
number number::operator /= ( number &b) {
	return *this=(*this)/b;
}
number number::operator % (const number &b) const{
	if(*this<b) return *this;
	number c,d;if((isfu&&b.isfu==0)||(isfu==0&&b.isfu)) c.isfu=1;
	else c.isfu=0;
	d.isfu=isfu;
	c.len=len+b.len+1;d.len=0;
	ft(i,len,1,-1){
		memmove(d.num+2,d.num+1,sz(d.num)-sz(int)*2);
		d.len++;
		d.num[1]=num[i];
		int l=0,r=9999,m;
		while(l<r){
			m=(l+r)/2;
			if((b*number(m))<=d) l=m+1;
			else r=m;
		}
     c.num[i]=r-1;
     d=d-b*number(r-1);
     }
	deletezero(c);
	return d;
}
number number::operator %= ( number &b) {
	return *this=(*this)%b;
}
number a,b;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>a>>b;
	cout<<a+b<<'\n'<<a-b<<'\n'<<a*b<<'\n'<<a/b<<'\n'<<a%b;
	return 0;
}