#95 高精度整数减法

模板

//C = 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 = 1;否则,t = 0 
		t = A[i] - t;
		if (i < B.size()) t = t - B[i]; //此时,t = A[i] - B[i] - t 
		C.push_back((t + 10) % 10); //这条语句覆盖了t >= 0和t < 0两种情况

		//若t >= 0,则本位运算未向高位借位,令t = 0;否则,令t = 1
		if (t >= 0) t = 0;
		else t = 1;
	}

	//C != 0时,消去前导0
	while (C.size() > 1 && C.back() == 0) C.pop_back();

	return C;
}

算法思路

1、本位差 = A[i] - B[i] - 低位向本位的借位t

2、若本位差 >= 0,t = 0;

      若本位差 < 0,需要向高位借1位,t = 1

例题

 (1)

问题描述:

以字符串形式输入两个大整数a,b(非负),求a - b。

题解:

#include <iostream>
#include <vector>

using namespace std;

//C = 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 = 1;否则,t = 0 
		t = A[i] - t;
		if (i < B.size()) t = t - B[i]; //此时,t = A[i] - B[i] - t 
		C.push_back((t + 10) % 10); //这条语句覆盖了t >= 0和t < 0两种情况

		//若t >= 0,则本位运算未向高位借位,令t = 0;否则,令t = 1
		if (t >= 0) t = 0;
		else t = 1;
	}

	//C != 0时,消去前导0
	while (C.size() > 1 && C.back() == 0) C.pop_back();

	return C;
}

//判断A与B的大小
bool cmp(vector<int> &A, vector<int> &B) {
	if (A.size() == B.size()) {
		for (int i = A.size() - 1; A[i] != B[i]; i--) return A[i] - B[i];
		return 1;
	}
	else {
		return A.size() > B.size();
	}
}

int main() {
	//输入两个大整数,用字符串的形式表示
	string a, b; //例如a='123456' 
	cin >> a >> b;

	vector<int> A, B, C;
	for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //A = {6, 5, 4, 3, 2, 1}
	for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

	if (cmp(A, B)) {
		 C = sub(A, B);
	}
	else {
		 C = sub(B, A);
		cout << '-';
	}

	for (int i = C.size() - 1; i >= 0; i--) cout << C[i];

	return 0;
}

猜你喜欢

转载自blog.csdn.net/Seattle_night/article/details/130022192
95