高精度减法

高精度减法模板https://www.acwing.com/problem/content/794/

减法注意要点:

  1. 对于 t = A[i] - B[i] - t; 可以拆为 t = A[i] - t如果B[i]合法,再t -= B[i] 这么两步来做
  2. 相减后t的处理 ,把 t >= 0t < 0 用一个式子来表示 t = (t + 10) % 10 这个木有想到
  3. A B大小判断,自己写的太冗余,不如单独拎出来
#include <bits/stdc++.h>

using namespace std;

//判断是否A >= B 
bool cmp(vector<int> &A, vector<int> &B){
	if(A.size() != B.size()) return A.size() > B.size();  //如果A,B不等,A大返回true,B大返回false 
	
	for(int i = A.size() - 1; i >= 0; i--){  //如果A,B数位相等,按人类习惯就从高位开始比较 
		if(A[i] != B[i]) return A[i] > B[i]; //同上 
	}
	return true; //都一样就返回true,因为判断是A >= B; 
}

vector<int> sub(vector<int> &A, vector<int> &B){
	vector<int> C;
	for(int i = 0, t = 0; i < A.size(); i++){ //t表示借位 
		t = A[i] - t;
		if(i < B.size()) t -= B[i];  //判断B是否还有位数 
		C.push_back((t + 10) % 10);  //合二为一  (1)t >= 0,输出t. (2)t < 0, 输出t + 10 
		if(t < 0) t = 1;  //更新进位 
		else t = 0;
	}
	
	while(C.size() > 1 && C.back() == 0) C.pop_back();  //去除前导0 
	return C;
	
}


int main(){
	string a, b;
	cin >> a >> b;
	vector<int> A, B;
	
	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;
	
	if(cmp(A, B)) C = sub(A, B);  //如果A >= B,直接减 
	else C = sub(B, A), cout << "-";  //A < B,先输出'-',再算 -(A - B) 
	
	for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
	cout << endl;
	
	return 0;
}


posted @ 2022-11-29 12:49  csai_H  阅读(33)  评论(0)    收藏  举报