高精度模板

#include<bits/stdc++.h>
using namespace std;
struct Big{
	int N;
	vector<int>vec;
	Big(int x=0):N(1),vec(10005,0){for(N=x?0:1;x;x/=10)vec[++N]=x%10;}
	Big(char *s):N(strlen(s)),vec(10005,0){for(int i=1;i<=N;++i)vec[i]=s[N-i]-'0';}
	Big operator +(const Big&A)const{
		Big C;int M=max(N,A.N);
		for(int i=1;i<=M;++i)C.vec[i]=vec[i]+A.vec[i];
		for(int i=1;i<=M;++i){
			C.vec[i+1]+=C.vec[i]/10;
			for(;C.vec[i]>=10;C.vec[i]-=10);
		}
		for(int i=M+1;i;--i)
			if(C.vec[i]){C.N=i;break;}
		return C;
	}
	Big operator +(const int&A)const{
		Big C(A);C=C+*this;
		return C;
	}
	Big operator -(const Big&A)const{
		Big C;C=*this;//被减数>=减数,小于的话交换打标记 
		for(int i=1;i<=A.N;++i)
			if(C.vec[i]>=A.vec[i])C.vec[i]-=A.vec[i];
			else C.vec[i]+=10-A.vec[i],--C.vec[i+1];
		for(int i=1;i<=C.N;++i)if(C.vec[i]<0){
			C.vec[i]+=10;--C.vec[i+1];
		}
		int i;for(i=C.N;i;--i)
			if(C.vec[i]>0){C.N=i;break;}
		if(i==0)C.N=1;
		return C;
	}
	Big operator -(const int&X)const{
		Big C(*this),A(X);
		for(int i=1;i<=A.N;++i)
			if(C.vec[i]>=A.vec[i])C.vec[i]-=A.vec[i];
			else C.vec[i]+=10-A.vec[i],--C.vec[i+1];
		for(int i=1;i<=C.N;++i)if(C.vec[i]<0){
			C.vec[i]+=10;--C.vec[i+1];
		}
		int i;for(i=C.N;i;--i)
			if(C.vec[i]>0){C.N=i;break;}
		if(i==0)C.N=1;
		return C;		
	}
	Big operator *(const Big&A)const{
		Big C;int M=N+A.N;
		for(int i=1;i<=N;++i)
			for(int j=1;j<=A.N;++j)
				C.vec[i+j-1]+=vec[i]*A.vec[j];
		for(int i=1;i<=M;++i){
			C.vec[i+1]+=C.vec[i]/10;
			for(;C.vec[i]>=10;C.vec[i]-=10);
		}
		for(int i=M+1;i;--i)
			if(C.vec[i]){C.N=i;break;}
		return C;
	}
	Big operator *(const int&A)const{
		Big C(A);C=C**this;
		return C;
	}
	Big operator +=(const Big&A){return *this=*this+A;}
	Big operator +=(const int&A){return *this=*this+A;}
	Big operator ++(){return *this=*this+1;}
	Big operator -=(const Big&A){return *this=*this-A;}
	Big operator -=(const int&A){return *this=*this+A;}
	Big operator --(){return *this=*this-1;}
	Big operator *=(const Big&A){return *this=*this*A;}
	Big operator *=(const int&A){return *this=*this*A;}
	bool operator <(const Big&A)const{//忽略负数比较 
		if(N!=A.N)return N>A.N;
		for(int i=N;i>=1;--i)
			if(vec[i]!=A.vec[i])return vec[i]>A.vec[i];
		return 0;
	}
	bool operator <=(const Big&A)const{
		if(N!=A.N)return N>A.N;
		for(int i=N;i>=1;--i)
			if(vec[i]!=A.vec[i])return vec[i]>A.vec[i];
		return 1;
	}
	bool operator >(const Big&A)const{
		if(N!=A.N)return N>A.N;
		for(int i=N;i>=1;--i)
			if(vec[i]!=A.vec[i])return vec[i]>A.vec[i];
		return 0;
	}
	bool operator >=(const Big&A)const{
		if(N!=A.N)return N>A.N;
		for(int i=N;i>=1;--i)
			if(vec[i]!=A.vec[i])return vec[i]>A.vec[i];
		return 1;
	}
	bool operator ==(const Big&A)const{
		if(N!=A.N)return 0;
		for(int i=N;i>=1;--i)
			if(vec[i]!=A.vec[i])return 0;
		return 1;
	}
	friend ostream& operator<<(ostream&output,const Big&A){
		for(int i=A.N;i>=1;--i)output<<A.vec[i];
		return output;
	}
};
char s[10005];
int main(){
	scanf("%s",s);
	Big a(s);
	cout<<(a-10)<<'\n';
	cout<<(a-Big(10))<<'\n';
//	swap(a,b);
//	cout<<(a<Big(100))<<'\n';
//	a=a+b;
//	a+=b;
//	++a;
//	a=a*b;
//	a*=b;
//	cout<<a*b<<'\n';
//	cout<<Big(a*b)<<'\n';
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值