算法笔记---大整数

题目描述

对一道A+B的题目,如果A和B的范围在int范围内,那么相信大家很快就能写出程序。但是如果A和B是有着1000个数位的整数,恐怕就没有办法用已有的数据类型来表示了,这时就只能老实去模拟加减乘除的过程。

解题思路:
使用数组来存储整数字符串,然后低位存放低位,高位存放高位

在进行大整数加减运算的时候,
若出现负数,则在最后输出的时候,添加负号即可

#include<iostream>
using namespace std;
#include<string>

struct bign
{
	int d[1000];
	int len;
	bign() {
		memset(d,0,sizeof(d));
		len = 0;
	}
};

bign change(string str) {//将整数转换为bign
	bign big;
	int len = str.size();
	big.len = len;
	for (int i = 0; i < len; i++) {
		big.d[i] = str[len - i - 1] - '0';//将str数组高位放在bign数组的高位
	}
	return big;
}

int compare(bign b1,bign b2) {//比较大小
	if (b1.len > b2.len) {
		return 1;
	}
	else if (b1.len < b2.len) {
		return -1;
	}
	else
	{
		for (int i = b1.len - 1; i >= 0; i--) {//从高位往地位比较
			if (b1.d[i] > b2.d[i]) {
				return 1;
			}
			else
			{
				return -1;
			}
		}
	}
	return 0;
}

bign add(bign b1,bign b2) {//加法,默认正整数
	bign big;
	int carry = 0;//表示进位
	for (int i = 0; i < b1.len || i < b2.len; i++) {
		int temp = b1.d[i] + b2.d[i] + carry;
		big.d[big.len++] = temp % 10;
		carry = temp / 10;
	}
	if (carry != 0) {
		big.d[big.len++] = carry;//进位不为零,直接加到最高位
	}
	return big;
}

bign sub(bign b1,bign b2) {//减法,默认都为正整数且b1 > b2
	bign big;
	int carry = 0;//借位:0表示不借位,1表示借位
	for (int i = 0; i < b1.len || i < b2.len; i++) {
		if (b2.d[i] <= b1.d[i] - carry) {//当前位够减
			big.d[big.len++] = b1.d[i] - carry - b2.d[i];
			carry = 0;
		}
		else//当前位不够减
		{
			big.d[big.len++] = b1.d[i] - carry + 10 - b2.d[i];
			carry = 1;
		}
	}
	while (big.len >= 1 && big.d[big.len - 1] == 0)//去掉最高位的0
	{
		big.len--;
	}
	return big;
}

//高精度与低精度的乘法
bign multi(bign b,int num) {
	bign big;
	int carry = 0;//进位
	for (int i = 0; i < b.len; i++) {
		int temp = b.d[i] * num + carry;
		big.d[big.len++] = temp % 10;
		carry = temp / 10;
	}
	while (carry != 0)//乘法可能有多位进位
	{
		big.d[big.len++] = carry % 10;
		carry /= 10;
	}
	return big;
}

//高精度与低精度除法
bign divide(bign b, int num, int& r) {//r为余数
	bign big;
	big.len = b.len;//商的位数与被除数的位数相同
	for (int i = b.len - 1; i >= 0; i--) {
		r = r * 10 + b.d[i];//每一次新的被除数
		if (r < num) {//不够除
			big.d[i] = 0;
		}
		else {//够除
			big.d[i] = r / num;
			r = r % num;//新的余数
		}
	}
	//去掉高位的零
	while (big.len - 1 >= 1 && big.d[big.len-1] == 0)//保证结果至少有一位
	{
		big.len--;
	}
	return big;
}

void printBign(bign big) {
	for (int i = big.len - 1; i >= 0; i--) {
		cout << big.d[i];
	}
	cout << endl;
}

//大整数的四则运算
int main() {

	//string str1,str2;
	//cin >> str1 >> str2;
	string str1;
	int num;
	cin >> str1 >> num;
	bign b1 = change(str1);
	//bign b2 = change(str2);
	//bign big = add(b1,b2);
	//bign big = sub(b1,b2);
	//bign big = multi(b1,num);
	int r = 0;
	bign big = divide(b1,num,r);
	printBign(big);
	cout << "余数为:" << r << endl;
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章