【每日算法】基础算法——高精度系列[高精度减法](八)

题目内容

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤10^5

输入样例

32
11

输出样例

21

题解

根据减法规则,对应位置的数字相减,那么可以得出以下两种情况,公式如下:

我们需要注意针对t的运用。t代表每次对应位置相减的结果,同时t还需要保留上一位是否进位的信息,则需要提前将其置1。

代码

#include <iostream>
#include <vector>

using namespace std;

bool cmp(vector<int> &A, vector<int> &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;
}

vector<int> sub(vector<int> &A, vector<int> &B){
vector<int> C;
for(int i = 0,t = 0; i < A.size(); i++){
t = A[i] - t;
if(i < B.size()) t-=B[i];
C.push_back((t + 10) % 10);
if(t < 0) t = 1;
else t = 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}

int main(){
string a, b;
vector<int> A,B;

cin >> 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');

if (cmp(A, B)){
auto C = sub(A,B);
for (int i = C.size() - 1; i>= 0; i-- ) printf("%d",C[i]);
}
else{
auto C =sub(B,A);
printf("-");
for (int i = C.size() - 1; i>= 0; i-- ) printf("%d",C[i]);
}
return 0;
}

原题链接

Author: Frederic Niu
Link: https://www.fredericniu.cn/2020/11/20/【每日算法】基础算法——高精度系列-高精度减法-(八)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号