[算法笔记]大整数运算

1.大整数存储

大整数又称高精度整数,用基本数据类型无法村存储其精度的整数,用数组存储
定义int型数组d[1000],数组中每一位存储整数的每一位,整数高位存储在数组的高位,整数的低位存储在数组的低位
运算的时候从低位到高位进行枚举,整数按字符串类型进行读入(读入的时候是逆序的 需要反转一下)

struct bign {
	int d[1000];
	int len;
	bign() {
		memset(d, 0, sizeof(d));
		len = 0;
	}
};
bign change(char str[]) {//整数转换成bign
	bign a;
	a.len = strlen(str);
	for (int i = 0; i < a.len; i++) {
		a.d[i] = str[a.len - i - 1] - '0';
	}
	return a;
}
int compare(bign a, bign b) {//比较两个大整数的大小
	if (a.len > b.len)return 1;
	else if (a.len < b.len)return -1;
	else {
		for (int i = a.len - 1; i >= 0; i--) {
			if (a.d[i] > b.d[i])return 1;
			else if (a.d[i] < b.d[i])return -1;
		}
		return 0;//相等
	}
}**

2.大整数加法

对其中一位加法的步骤,将该位上两个数字相加,再加上进位,得到的数取个位作为该位结果,取其余作为新的进位。
(如果有一方是负数,取其绝对值,然后做减法运算,如果两个都是负的,都取绝对值,加完之后再把负号加回去)

bign add(bign a, bign b) {
	bign c;
	int carry = 0;//进位
	for (int i = 0; i < a.len || i < b.len; i++) {
		int temp = a.d[i] + b.d[i] + carry;
		c.d[c.len++] = temp % 10;
		carry = temp / 10;
	}
	if (carry != 0) {
		c.d[c.len++] = carry;
	}
	return c;
}

3.大整数减法

对每一位,比较被减位和减位,如果不够减,令被减位的高位减1,被减位加10,如果够减,直接减,最后去除高位多余的0,最少保证有一位数
(减之前要比较两个数的大小,如果a

bign sub(bign a, bign b) {
	bign c;
	for (int i = 0; i < a.len || i < b.len; i++) {
		if (a.d[i] < b.d[i]) {
			a.d[i + 1]--;
			a.d[i] += 10;
		}
		c.d[c.len++] = a.d[i] - b.d[i];
	}
	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0) {//去除最高位的0 同时最少保留一个最低位
		c.len--;
	}
	return c;
}

4.大整数乘法(高进度*低精度)

对每一位,取bign的某位与int型整体相乘,再与进位相加,所得个位数作为该位结果,高位部分作为新的进位
(有负号取其绝对值,然后带入函数)

bign multi(bign a, int b) {
	bign c;
	int carry = 0;
	for (int i = 0; i < a.len; i++) {
		int temp = a.d[i] * b + carry;
		c.d[c.len++] = temp % 10;
		carry = temp / 10;
	}
	while (carry != 0) {
		c.d[c.len++] = carry % 10;
		carry /= 10;
	}
	return c;
}

5.大整数除法(高精度/低精度)

对每一步,上一步的余数乘以10加上该步的位,得到临时的被除数,将其与除数比较,如果不够除,则该位的商为0,如果够除,则商即为对应的商,余数即为对应的余数,最后和减法一样处理高位的0

bign divide(bign a, int b,int &r) {
	bign c;
	c.len = a.len;
	for (int i = a.len - 1; i >= 0; i--) {
		r = r * 10 + a.d[i];
		if (r < b)c.d[i] = 0;
		else {
			c.d[i] = r / b;
			r = r % b;
		}
	}
	while (c.len - 1 >= 1 && c.d[c.len - 1] == 0) {//去除高位的0,保留一位最低位
		c.len--;
	}
	return c;
}

你可能感兴趣的:(算法笔记)