高精度计算_大整数_加_减_乘_除_int型_模板_基于deque

版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/83239321

下面给出的是大整数加, 减, 乘, 除int型的模板:

约定: 下面的模板实现中a, b均为HEX进制数, 且a[0]为a的最高位

const int HEX = 1e9;//运算采取的进制 
deque<int> operator + (const deque<int> &a, const int b){//a,b均为HEX进制数,且a[0]为a的最高位 
	deque<int> res;
	int carry = 0;//进位值 
	for(int i = a.size() - 1, tmp; i >= 0; --i)
		tmp = a[i] + (i == 0) * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX;
	return carry? res.push_front(1), res: res;
}
deque<int> operator - (const deque<int> &a, const int b){//返回a - b,要求a >= b 
	deque<int> res;
	for(int i = a.size() - 1, rent = 0, tmp; i >= 0; --i)//rent:借位标志 
		tmp = a[i] - (i == 0) * b - rent, res.push_back(tmp < 0? tmp + HEX: tmp), rent = (tmp < 0? 1: 0);
	while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多余0 
	return res;
}
deque<int> operator * (const deque<int> &a, const int b){//返回a * b 
	deque<int> res;
	int carry = 0;
	for(long long i = a.size() - 1, tmp; i >= 0; --i)
		tmp = (long long)a[i] * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX;
	if(carry) res.push_front(carry);
	while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多余0
	return res;
}
deque<int> operator / (const deque<int> &a, const int b){//返回a / b
	deque<int> res;
	for(long long i = 0, rem = 0, tmp; i < a.size(); ++i)
		tmp = rem * HEX + a[i], res.push_back(tmp / b), rem = tmp % b;
	while(res.size() > 1 && !res[0]) res.pop_front();
	return res;
} 
void show(const deque<int> &a){//打印num对应的整数值 
	printf("%d", a[0]);
	for(int i = 1; i < a.size(); ++i) printf("%09d", a[i]);
}

下面的测试程序充分展示了上述模板的使用方法:

//大整数加,减,乘,除1位数(基于deque) 
#include <cstdio>
#include <deque>
using namespace std;
const int HEX = 1e9;//运算采取的进制 
deque<int> operator + (const deque<int> &a, const int b){//a,b均为HEX进制数,且a[0]为a的最高位 
	deque<int> res;
	int carry = 0;//进位值 
	for(int i = a.size() - 1, tmp; i >= 0; --i)
		tmp = a[i] + (i == 0) * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX;
	return carry? res.push_front(1), res: res;
}
deque<int> operator - (const deque<int> &a, const int b){//返回a - b,要求a >= b 
	deque<int> res;
	for(int i = a.size() - 1, rent = 0, tmp; i >= 0; --i)//rent:借位标志 
		tmp = a[i] - (i == 0) * b - rent, res.push_back(tmp < 0? tmp + HEX: tmp), rent = (tmp < 0? 1: 0);
	while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多余0 
	return res;
}
deque<int> operator * (const deque<int> &a, const int b){//返回a * b 
	deque<int> res;
	int carry = 0;
	for(long long i = a.size() - 1, tmp; i >= 0; --i)
		tmp = (long long)a[i] * b + carry, res.push_front(tmp % HEX), carry = tmp / HEX;
	if(carry) res.push_front(carry);
	while(res.size() > 1 && !res[0]) res.pop_front();//去除高位多余0
	return res;
}
deque<int> operator / (const deque<int> &a, const int b){//返回a / b
	deque<int> res;
	for(long long i = 0, rem = 0, tmp; i < a.size(); ++i)
		tmp = rem * HEX + a[i], res.push_back(tmp / b), rem = tmp % b;
	while(res.size() > 1 && !res[0]) res.pop_front();
	return res;
} 
void show(const deque<int> &a){//打印num对应的整数值 
	printf("%d", a[0]);
	for(int i = 1; i < a.size(); ++i) printf("%09d", a[i]);
}
int main(){
	deque<int> a(1, 1);
	for(int i = 1; i <= 20; ++i) a = a * i;
	printf("Test case 1: a = "), show(a), printf("\n");
	for(int i = 1; i <= 20; ++i) a = a / i;
	printf("Test case 2: a = "), show(a), printf("\n"); 
	printf("Test case 3: a = "), show(a - 1), printf("\n");
	printf("Test case 4: a = "), show(a + 99999999), printf("\n");
	return 0;
}

测试程序运行结果截图:

猜你喜欢

转载自blog.csdn.net/solider98/article/details/83239321
今日推荐