题目描述
高精度减法
C++ 代码
#include <bits/stdc++.h>
using namespace std;
//用于判断减数和被减数的大小关系
bool cmp(vector<int>&A,vector<int>&B)
{
//两数数位相同则进行下一项比较,否则直接返回哪个大
if(A.size() != B.size()) return A.size() > B.size();
for(int i = B.size() - 1;i >= 0;i--)
{
//从位数最大的位开始,遍历每一位,若A数大则返回true
if(A[i] != B[i]) return A[i] > B[i];
}
若每一位数字也相同,那么两数相减也是非负数,故返回true。
return true;
}
vector<int> sup(vector<int>&A,vector<int>&B)
{
vector<int>C;
int t = 0;
for(int i = 0;i < A.size();i++)
{
//从个位开始被减数先加上进位数
t += A[i];
//当减数还未遍历完时,减去减数
if(i < B.size()) t -= B[i];
//把得到的结果转化成正数并放到答案数组里
C.push_back((t + 10) % 10);
//如果结果等于0,则无需借位
if(t >= 0) t = 0;
//否则需要向更高位借一位
else t = -1;
}
//当答案不为零但有前导零时,将其消去。
while(C.size() > 1&&C.back() == 0) C.pop_back();
return C;
}
int main()
{
//数据过大,需使用字符串来保存
string a,b;
vector<int>A,B;
cin >> a;
cin >> 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)) for(int i = sup(A,B).size() - 1;i >= 0;i--) cout << sup(A,B)[i];
//否则反过来计算,然后再结果之前加上负号
else{
cout << '-';
for(int i = sup(B,A).size() - 1;i >= 0;i--) cout << sup(B,A)[i];
}
return 0;
}