大整數類BigInteger (完善加減乘除)

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct BigInteger {
	static const int Base = 10000;
	static const int WIDTH = 4;
	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) {
		string str1;	//消除前導零
		str1.resize(str.length());
		int flg = 0;
		int i,j;
		for (i = 0, j = 0; i < str.length(); i++) {
			if (str[i] != '0')flg = 1;
			if (flg) { str1[j++] = str[i]; }
		}
		str1.resize(j);
		s.clear();		//賦值
		int x, len = (str1.length() - 1) / WIDTH + 1;
		for (int i = 0; i < len; i++) {
			int end = str1.length() - i * WIDTH;
			int start = max(0, end - WIDTH);
			sscanf(str1.substr(start, end - start).c_str(), "%d", &x);
			s.push_back(x);
		}
		return *this;
	}
	//大數加法
	BigInteger operator + (const BigInteger &b) {
		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) {
		BigInteger c, c1 = *this, c2 = b;
		c.s.clear();
		int flg = 0;
		if (c1 < c2) {		//保證C1 大於 C2
			flg = 1;
			BigInteger tmp = c1;
			c1 = c2;
			c2 = tmp;
		}
		int i;
		for (i = 0;; i++) {		
			int g = 0;
			if (i < c1.s.size())g += c1.s[i];
			if (i < c2.s.size())g -= c2.s[i];
			//出現前導零時,不儲存直接退出
			if (g == 0 && i + 1 >= c1.s.size() && i + 1 >= c2.s.size())break;
			//相減小於零時,向前借位
			if (g < 0&& i +1 <c1.s.size()) { g = g + Base; c1.s[i + 1]--; }
			c.s.push_back(g);
		}
		//如果小於 乘上 -1 
		if (flg) c.s[c.s.size() - 1] *= -1;
		return c;
	}
	//與整數相乘  (注意這裏要用long long ,int會溢出)
	BigInteger operator *(long long num)const {
		BigInteger c;
		c.s.clear();
		int i;
		long long g = 0;
		for (i = 0;; i++) {
			long long x = g;
			if (g == 0 && i >= s.size())break;
			if (i < s.size())x += s[i] * num;
			c.s.push_back(x%Base);
			g = x / Base;
		}
		return c;
	}
	//大數相乘
	BigInteger operator *(const BigInteger &b) const{
		BigInteger C;
		C.s.clear();
		int i;
		for (i = 0; i < s.size(); i++) {
			BigInteger D;
			D = b * s[i];
			int j = i;
			while (j--) {
				D = D * Base;
				//向前進位
			}
			C = C + D;
		}
		return C;
	}
	//大數相除	減去多少個除數  商就爲多少 
	BigInteger operator /(const BigInteger&b)const {
		BigInteger C, c1 = *this, c2 = b;
		C.s.clear();
		if (*this < b) {
			C = 0; return C;
		}
		else if (*this == b) { C = 1; return C; }
		for (;;) {
			c2 = b;
			if (c1 < c2)break;
			long long  n = 1, cnt = 0;
			while ((c2 * 10) <= c1) {
				//可想成 一次減10的n次方個
				n *= 10;
				c2 = c2 * 10;
			}
			while (c2 <= c1) {
				c1 = c1 - c2;
				cnt++;
			}
			BigInteger D;
			D = cnt * n;
			C = C + D;
		}
		return C;
	}
	//大數取模
	BigInteger operator %(const BigInteger &b) {
		BigInteger C;
		C.s.clear();
		if (*this < b) { return *this; }
		else if (*this == b) { C = 0; return C; }
		BigInteger D;
		D = (*this) / b;
		C = (*this) - (D * b);
		return C;
	}
	//大數比較大小
	bool operator < (const BigInteger &b) const{
		if (s.size() != b.s.size())return s.size() < b.s.size();
		int i;
		for (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); }
};
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, "%04d", x.s[i]);
		out << buf;
	}
	return out;
}
istream& operator >> (istream &in, BigInteger &x) {
	string s;
	if (!(in >> s)) return in;
	x = s;
	return in;
}
int main() {
	BigInteger BI, BI2;
	BI = "0000022222";
	cout << "BI  " << BI << endl;
	cin >> BI2;
	cout << "BI2 "<< BI2 << endl;
	cout << "BI+ BI2: " << (BI + BI2) << endl;
	cout << "BI- BI2: " << (BI - BI2) << endl;
	cout << "BI * BI2: " << (BI * BI2) << endl;
	cout << "BI / BI2: " << (BI / BI2) << endl;
	cout << "BI % BI2: " << (BI % BI2) << endl;
	cout << "BI * 123789: " << (BI * 123789) << endl;
	cout << "BI < BI2: " << (BI < BI2) << endl;

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章