AcWing 792. 高精度减法
原题链接
简单
作者:
咲张熊猫人
,
2021-01-14 20:59:16
,
所有人可见
,
阅读 308
C++ 代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
auto check(vector<int>&A, vector<int>&B) -> bool
{
//if(A.size() > B.size()) return true;
//else if(A.size() < B.size()) return false;
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; //在这里返回true说明A, B 相同
}
vector<int> sub(vector<int> &A, vector<int> &B) //这里通过调用前的check函数保证参1 >= 参2
{
int t = 0; //进位初始为0
vector<int> C;
for(int i = 0; i < A.size(); i++)
{
t += A[i]; //保存单个位上的被减数
if(i < B.size()) t -= B[i];
C.push_back((t + 10) % 10); //这里的 +10, 是为了将 t >= 0 和 t < 0 统一写法
if(t < 0) t = -1; //若 t < 0, 则t变为-1,表示借位
else t = 0; //若 t > 0, 则一定要把t清0,表示没有借位.
}
while(C.size() > 1 && C.back() == 0) C.pop_back(); //清除前导0, 注意这里是 > 1. 如果写成 C.size() && ...
// 则如果结果为0,则会全部清掉
return C;
}
int main()
{
string s1, s2;
cin >> s1 >> s2;
vector<int> A, B;
for(int i = s1.size() - 1, j = s2.size() - 1; i >= 0 || j >= 0; i--,j--)
{
if(i >= 0) A.push_back(s1[i] - '0');
if(j >= 0) B.push_back(s2[j] - '0');
}
vector<int> C;
if(check(A,B)) C = sub(A,B); //这里执行检查 控制sub函数的参1 >= 参2
else C = sub(B,A), cout << "-"; //若判断结果为负数,先输出符号位
//cout<<"hello world"<<endl;
for(int i = C.size() - 1; i >= 0; i--)
cout << C[i];
cout << endl;
}