高精度运算c++模板(加减乘、高精度除低精度及取模)

包括高精度间的加、减、乘,及高精度除低精度,正数高精度模低精度

#include 
#include 
#include 
#include 
using namespace std;

struct BigInt {
	int num[1000];
	int len;
	bool symbol;
	BigInt() {
		fill(num, num + 1000, 0);
		len = 0;
		symbol = true;
	}
	void set(string str) {
		int tmp = 0;
		int weight = 1;
		if (str[0] == '-') {
			symbol = false;
			str = str.substr(1);
		}
		for (int i = str.size() - 1; i >= 0; i--) {
			tmp += (str[i] - '0') * weight;
			weight *= 10;
			if (weight == 10000 || i == 0) {
				num[len] = tmp;
				tmp = 0;
				weight = 1;
				len++;
			}
		}
	}
	void output() {
		if (!symbol && !(len == 1 && num[0] == 0))
			cout << '-';
		cout << num[len - 1];
		for (int i = len - 2; i >= 0; i--) {
			cout << setw(4) << setfill('0') << num[i];
		}
		cout << endl;
	}
	BigInt operator + (BigInt b) {
		BigInt res;
		//处理符号
		if (!symbol && !b.symbol) {
			res.symbol = false;
		}
		else if (!symbol && b.symbol) {
			BigInt ta = *(this);
			ta.symbol = true;
			return b - ta;
		}
		else if (symbol && !b.symbol) {
			b.symbol = true;
			return *(this) - b;
		}
		//正数运算
		int carry = 0;
		for (int i = 0; i < len || i < b.len; i++) {
			int tmp = num[i] + b.num[i] + carry;
			res.num[i] = tmp % 10000;
			carry = tmp / 10000;
			res.len++;
		}
		if (carry) {
			res.num[len] = carry;
			res.len++;
		}
		return res;
	}
	bool operator < (BigInt b) { //正数比较大小
		if (len < b.len)
			return true;
		else if (len == b.len) {
			for (int i = len - 1; i >= 0; i--) {
				if (num[i] < b.num[i])
					return true;
				else if (num[i] > b.num[i])
					return false;
			}
		}
		return false;
	}
	BigInt operator - (BigInt b) {
		BigInt res;
		//处理符号
		if (!symbol && !b.symbol) {
			BigInt ta = *(this);
			ta.symbol = true;
			b.symbol = true;
			return b - ta;
		}
		else if (!symbol && b.symbol) {
			BigInt ta = *(this);
			ta.symbol = true;
			BigInt r = ta + b;
			r.symbol = false;
			return r;
		}
		else if (symbol && !b.symbol) {
			b.symbol = true;
			return *(this) + b;
		}
		//正数运算
		BigInt big, small; 
		if (*(this) < b) { //小数减大数,结果为负,然后转换成大数减小数
			big = b;
			small = *(this);
			res.symbol = false;
		}
		else {
			big = *(this);
			small = b;
		}
		int borrow = 0;
		for (int i = 0; i < big.len || i < small.len; i++) {
			int tmp = big.num[i] - small.num[i] - borrow;
			if (tmp < 0) {
				tmp += 10000;
				borrow = 1; //借位
			}
			else 
				borrow = 0;
			res.num[i] = tmp;
			res.len++;
		}
		for (int i = res.len - 1; i > 0; i--) { //删除第一个有效数字前面的0
			if (res.num[i] != 0)
				break;
			res.len--;
		}
		return res;
	}
	BigInt operator * (BigInt b) {
		BigInt res;
		//处理符号
		if ((!symbol && b.symbol) || (symbol && !b.symbol))
			res.symbol = false;
		//四位四位一乘,与一位一位一乘同理
		for (int i = 0; i < len; i++) { //用当前大整数的每四位
			for(int j = 0; j < b.len; j++) { //去乘b的每四位
				int tmp = num[i] * b.num[j] + res.num[i + j];
				res.num[i + j] = tmp % 10000; //结果依次往前挪位
				res.num[i + j + 1] += tmp / 10000;
			}
		}
		res.len = len + b.len; //乘法结果最长长度为两数长度相加, 置为最长后去0
		for (int i = res.len - 1; i > 0; i--) {
			if (res.num[i] != 0)
				break;
			res.len--;
		}
		return res;
	}
	BigInt operator / (int b) { //高精度 / 低精度
		BigInt res;
		//处理符号
		bool bsymbol = true;
		if (b < 0) {
			bsymbol = false;
			b = -b;
		}
		if ((!symbol && bsymbol) || (symbol && !bsymbol))
			res.symbol = false;
		//四位四位一除,与一位一位一除同理
		int r = 0;
		for (int i = len - 1; i >= 0; i--) {
			int tmp = r * 10000 + num[i];
			res.num[i] = tmp / b;
			r = tmp % b;
		}
		res.len = len;
		for (int i = res.len - 1; i > 0; i--) {
			if (res.num[i] != 0)
				break;
			res.len--;
		}
		return res;
	}
	int operator % (int b) { //正数高精度 mod 正数低精度
		int r = 0;
		for (int i = len - 1; i >= 0; i--) 
			r = (r * 10000 + num[i]) % b;
		return r;
	}
};

int main() {
	string sa, sb;
	while (cin >> sa >> sb) {
		BigInt a, b;
		a.set(sa);
		b.set(sb);
		BigInt add = a + b;
		BigInt sub = a - b;
		BigInt mul = a * b;
		BigInt div = a / 5;
		int mod = a % 5;
		add.output();
		sub.output();
		mul.output();
		div.output();
		cout << mod << endl;
	}
}

参考

《王道机试指南》

你可能感兴趣的:(算法#高精度)