题目描述:
分析:
一、A - B分两种情况:
- 当A>=B ----> A - B;
- 当A<=B ----> -(B-A);
二、借位 t 的情况:
- t >= 0 : 说明t不需要借位
- t < 0 : 说明 需要 t+10 去补
AC代码如下:
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int> &A,vector<int> &B)
{
//如果A的位数大于B的位数返回true
if(A.size() != B.size()) return A.size() > B.size();
//位数相同情况下,比较每一个位上的数字大小
for(int i=A.size()-1;i>=0;i--)
{
//如果不等那就判断谁大,通过谁大返回对应true,false
if(A[i] != B[i])
{
return A[i] > B[i];
}
}
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{
vector<int> C;
int t = 0;
for(int i=0;i<A.size();i++)
{
//像前面借一位
t = A[i] - t;
if(i < B.size()) t = t - B[i];
//减完t会分两种情况t>=0 和 t<0(借位,相当于+10)
//把两种情况合并为(t+10)% 10,这样不会影响
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; //"123456"
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;
}
欢迎小伙伴,有疑问留言~