高精度减法

高精度减法模板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 @   csai_H  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示