高精度运算

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

1、高精度

高精度运算指的是特别大的数字运算,int类型也就23亿左右,也就10个位数,但是高精度的数字可以达到10的6次幂个数字。这个时候高精度的数字就要使用数组来储存了。比如说数字123456789 存储在数组中应该是这样的:

vector[0]=9

vector[1]=8

vector[2]=7

vector[3]=6

...

vector[4]=1 之所以要把最高位的1放在最后,是因为这样在进位时我们只需要在数组后面插入1课,如果是vector[0]存储最高位,那么在进位时就要移动整个数组了。

2、加法

vector<int> add(vector<int> &A, vector<int> &B)
{
	vector<int> C;
	if (A.size() < B.size()) return add(B, A);//保证都好左边的大
	int t = 0;//进位,每次相加都是A[i],B[i],t三个相加
	for (int i = 0; i < A.size(); i++) {//以大的为基准进行行相加
		t += A[i];//先加A[i]
		if (i < B.size()) t += B[i];//如果B[i]还有的话就
		C.push_back(t % 10);//余数新数组
		t /= 10;//进位数t==1或t==0
	}
	if (t) C.push_back(1);//最高位还要进位就在就把1压入栈内
	return C;
}

3、减法

需要注意的是我们希望是大的数减去小的数,所以再见之前还要去判断一下谁大

bool cmp(vector<int> &A, vector<int> &B)//判断的是A>=B返回值呢否则返回假
{
	if (A.size() != B.size()) return (A.size() > B.size());
	for (int i = A.size() - 1; i >= 0; i--)
	{
		if (A[i] != B[i])
			return (A[i] > B[i]);
	}
	return true;//A==B返回真
}
vector<int> sub(vector<int> &A, vector<int> &B)
{
	vector<int> C;
	int t = 0;//进位
	for (int i = 0; i < A.size(); i++) {
		t = A[i]-t;//t前一位借走的
		if (i < B.size()) t -= B[i];//B不能越位
		C.push_back((t + 10) % 10);//合二为一,t不变
		if (t < 0) t = 1;//t<0说明借一了,所以t=1,算下以为是要减去
		else t = 0;//t==0就是没借
	}
	while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前导零
	//但是要把正结果为0
	return C;
}

4、乘法

这里乘法是指一个高精度数成一个较小的数

vector<int> mul(vector<int> &A, int b)
{//高精度书乘以一个小一点的数。
	vector<int> C;
	int t = 0;//进位,t不只是一位数了,因为我们每次计算都是让A[i]*b,b虽然小但他的小时相对于高精度数的
	for (int i = 0; i < A.size()||t; i++) {
		if (i < A.size())
			t += A[i] * b;
		C.push_back(t % 10);
		t /= 10;
	}
	return C;
}

5、测试

void test01()
{
	string a, b;
	vector<int> A, B;
	cin >> a >> b;//a="123456"
	for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
	for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
	//加法测试
        vector<int> C = add(A, B);
	for (int i = C.size() - 1; i >= 0; i--)
		printf("%d", C[i]);
        printf("\n");
        /。减法测试  
        if (cmp(A, B))
	{
		vector<int> C = sub(A, B);
		for (int i = C.size() - 1; i >= 0; i--)
			printf("%d", C[i]);
	}
	else
	{
		vector<int> C = sub(B, A);
		printf("-");
		for (int i = C.size() - 1; i >= 0; i--)
			printf("%d", C[i]);
        printf("\n");
	}
}
//乘法测试
void test03()
{
	string a;
	vector<int> A;
	int b;
	cin >> a >> b;//a="123456"
	for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
	vector<int> C = mul(A, b);
	for (int i = C.size() - 1; i >= 0; i--)
		printf("%d", C[i]);
}

image.png

image.png