码迷,mamicode.com
首页 > 其他好文 > 详细

Bigint类

时间:2017-10-20 11:51:32      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:als   pac   out   push   size   highlight   std   return   using   

#include <bits/stdc++.h>
using namespace std;
struct Bigint{
	vector<int> num;
	bool flag;
	Bigint(){
		num.clear();
		flag=true;
	}
	Bigint &operator =(int b){
		if(b<0){
			flag=false;
			b=-b;
		}
		while(b){
			(*this).num.push_back(b%10000000);
			b/=10000000;
		}
		return *this;
	}
};
bool operator <(Bigint a,Bigint b){
	if(a.flag!=b.flag)
		return b.flag;
	if(a.num.size()!=b.num.size())
		return a.num.size()<b.num.size();
	for(int i=a.num.size()-1;~i;i--)
		if(a.num[i]!=b.num[i])
			return a.num[i]<b.num[i];
	return false;
}
bool operator <= (Bigint a,Bigint b){
	if(a.flag!=b.flag)
		return b.flag;
	if(a.num.size()!=b.num.size())
		return a.num.size()<b.num.size();
	for(int i=a.num.size()-1;~i;i--)
		if(a.num[i]!=b.num[i])
			return a.num[i]<b.num[i];
	return true;
}
bool operator ==(Bigint a,Bigint b){
	return a.num==b.num&&a.flag==b.flag;
}
bool operator !=(Bigint a,Bigint b){
	return !(a==b);
}
bool operator >(Bigint a,Bigint b){
	return !(a<=b);
}
bool operator >=(Bigint a,Bigint b){
	return !(a<b);
}
Bigint operator -(Bigint a){
	a.flag=!a.flag;
	return a;
}
Bigint operator +(Bigint a,Bigint b){
	if(a.flag==b.flag){
		if(a.num.size()<b.num.size())
			swap(a,b);
		for(int i=0;i<b.num.size();i++)
			a.num[i]+=b.num[i];
	
		for(int i=0;i<a.num.size()-1;i++)
			if(a.num[i]>100000000){
				a.num[i+1]+=a.num[i]/100000000;
				a.num[i]%=100000000;
			}
		while(a.num.back()>100000000){
			a.num.push_back(a.num[a.num.size()-1]/100000000);
			a.num[a.num.size()-2]%=100000000;
		}
	}
	else {
		bool c;
		if(a.num.size()<b.num.size())
			swap(a,b);
		else 
			if(a<-b)
				swap(a,b);
		if(a<-b)
			c=b.flag;
		else
			c=a.flag;
		for(int i=0;i<b.num.size();i++)
			a.num[i]-=b.num[i];
		for(int i=0;i<a.num.size()-1;i++)
			if(a.num[i]<0){
				a.num[i]+=100000000;
				a.num[i+1]-=1;
			}
		while(!a.num.back()&&a.num.size()>1)a.num.pop_back();
		a.flag=c;
		if(!a.num.back())
			a.flag=true;
	}
	return a;
}
Bigint operator -(Bigint a,Bigint b){
	return a+(-b);
}
istream &operator >>(istream &is,Bigint &a){
string str;
int b=0,i,k=0;
	is>>str;
	i=str.size()-1;
	a.num.clear();
	if(str[0]==‘-‘){
		a.flag=false;
		k++;
	}
	else
		a.flag=true;
	for(;i>=k;i-=8){
		b=(str[i]-‘0‘);
		for(int j=1,kk=10;j<8;j++,kk*=10)
			if((i-j)>=k)
				b+=(str[i-j]-‘0‘)*kk;
			else
				break;
		a.num.push_back(b);
	}
	return is;
}
ostream &operator <<(ostream &os,Bigint a){
	if(!a.flag)
		os<<‘-‘;
	os<<a.num[a.num.size()-1];
	for(int i=a.num.size()-2;~i;i--)
		for(int j=0,k=10000000;j<8;j++,k/=10){
			os<<a.num[i]/k%10;
		}
	return os;
}
int main(){
Bigint a,b,c;
int x,y;
	cin>>a>>b;
	cout<<a-b;
	return 0;
}

  

Bigint类

标签:als   pac   out   push   size   highlight   std   return   using   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7698493.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!