高精度模板2.0

代码:

#include<bits/stdc++.h>
using namespace std;
const int SIZE=10010;
struct Int{
	int len,n[SIZE];
	void Set(int l){
		len=l;
		for(int i=1;i<=len;i++) n[i]=0;
	}
	Int(char *s){
		len=strlen(s);
		for(int i=len-1;~i;i--){
			if(s[i]<='9'&&s[i]>='0'){
				len=i+1;
				break;
			}
		}
		for(int i=len;i>=1;i--) n[i]=s[len-i]-'0';
	}
	Int(long long x=0){
		len=0;
		do{
			n[++len]=x%10;
			x/=10;
		}while(x);
	}
	bool operator < (const Int b){
		if(len!=b.len) return len<b.len;
		for(int i=len;i;i--)
			if(n[i]!=b.n[i]) return n[i]<b.n[i];
		return 0;
	}
	Int operator + (const Int b){
		Int ans;
		ans.Set(max(len,b.len)+1);
		for(int i=1;i<=ans.len;i++){
			if(i<=len) ans.n[i]+=n[i];
			if(i<=b.len) ans.n[i]+=b.n[i];
			ans.n[i+1]+=ans.n[i]/10;
			ans.n[i]%=10;
		}
		while(ans.n[ans.len]==0&&ans.len>1) ans.len--;
		return ans;
	}
	Int operator - (const Int b){
		Int ans,a=*(this );ans.Set(len);
		for(int i=1;i<=ans.len;i++){
			if(a.n[i]<b.n[i]) a.n[i]+=10,a.n[i+1]--;
			ans.n[i]=a.n[i]-(i>b.len?0:b.n[i]);
		}
		while(ans.n[ans.len]==0&&ans.len>1) ans.len--;
		return ans;
	}
	Int operator * (const Int b){
		Int ans;
		ans.Set(len+b.len);
		for(int i=1;i<=len;i++){
			for(int j=1;j<=b.len;j++){
				ans.n[i+j-1]+=n[i]*b.n[i];
				ans.n[i+j]+=ans.n[i+j-1]/10;
				ans.n[i+j-1]%=10;
			}
		}
		while(ans.n[ans.len]==0&&ans.len>1) ans.len--;
		return ans;
	}
	Int operator / (const int &b){
		if((*this)<Int(b)) return Int(0LL);
		Int ans;
		ans.len=len;
		int r=0;
		for(int i=ans.len;i;i--){
			r=r*10+n[i];
			ans.n[i]=r/b;
			r%=10;
		}
		while(ans.n[ans.len]==0&&ans.len>1) ans.len--;
		return ans;
	}
	Int operator / (const Int b){
		if((*this)<b) return Int(0LL);
		Int ans;
		ans.Set(len-b.len+1);
		for(int i=ans.len;i;i--){
			for(int j=1;j<=9;j++){
				ans.n[i]++;
				if((*this)<(ans*b)){
					ans.n[i]--;
					break;
				}
			}
		}
		while(ans.n[ans.len]==0&&ans.len>1) ans.len--;
		return ans;
	}
	void print(){
		for(int i=len;i;i--)
			printf("%d",n[i]);
		printf("\n");
	}
};
int main(){
	char aa[100010],bb[100010],x;
	cin>>aa>>x>>bb;
	Int a=aa,b=bb,ans;
	if(x=='+') ans=a+b;
	if(x=='-') ans=a-b;
	if(x=='*') ans=a*b;
	if(x=='/') ans=a/b;
	ans.print();
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值