1. 程式人生 > >c++高精度演算法-大整數運算

c++高精度演算法-大整數運算

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

struct BigInteger{
	static const int BASE=100000000;
	static const int WIDTH=8;
	vector<int> s;
	
	BigInteger(long long num=0){*this=num;}	//建構函式 
	
	BigInteger operator = (long long num){	//賦值運算子 
		s.clear();
		do{
			s.push_back(num%BASE);
			num/=BASE;
		}while(num>0);
		
		return *this;
	}
	
	BigInteger operator =(const string& str){	//賦值運算子 
		s.clear();
		int x,len=(str.length()-1)/WIDTH+1;
		for(int i=0;i<len;i++){
			int end=str.length()-i*WIDTH;
			int start=max(0,end-WIDTH);
			sscanf(str.substr(start,end-start).c_str(),"%d",&x);
			s.push_back(x);
		}
		return *this;
	}
	BigInteger operator + (const BigInteger& b) const{
		BigInteger c;
		c.s.clear();
		for(int i=0,g=0;;i++){
			if(g==0&&i>=s.size()&&i>=b.s.size()) break;
			int x=g;
			if(i<s.size()) x+=s[i];
			if(i<b.s.size()) x+=b.s[i];
			c.s.push_back(x % BASE);
			g=x/BASE;
		}
		return c;
	}
	BigInteger operator += (const BigInteger& b){
		*this=*this+b;
		return *this;
	}
};
//輸入與輸出 
ostream& operator << (ostream &out,const BigInteger& x){
	out << x.s.back();
	for(int i=x.s.size()-2;i>=0;i--){
		char buf[20];
		sprintf(buf,"%08d",x.s[i]);
		for(int j=0;j<strlen(buf);j++) out << buf[j];
	}
	return out;
} 
istream& operator >> (istream &in,BigInteger& x){
	string s;
	if(!(in>>s)) return in;
	x=s;
	return in;
}
//比較 
// < 前提沒有前導0 
bool operator < (const BigInteger& b) const {
	if(s.size()!=b.s.size()) return s.size()<b.s.size();
	for(int i=s.size()-1;i>=0;i--)
		if(s[i]!=b.s[i]) return s[i]<b.s[i];
	return false;	//相等 
}
//用 < 定義其他比較運算子
bool operator > (const BigInteger& b) const{return b<*this;}
bool operator <= (const BigInteger& b) const{return !(b<*this);}
bool operator >= (const BigInteger& b) const{return !(*this<b);}
bool operator != (const BigInteger& b) const{return b<*this||*this<b;} 
bool operator == (const BigInteger& b) const{return !(b<*this)&&!(*this<b);}

int main(){
	BigInteger a,b,sum;
	cin>>a>>b;
	sum+=a;
	sum+=b;
	cout<<a+b<<endl;
	cout<<sum<<endl;
	return 0;
}