算法思路
和高精度加法类似,注意到题中给的A和B都是正整数,若不加限制则需对输入输出做出限制,问题转换为|A|-|B|或|A|+|B|。
1.对于减法首先处理A>=B问题决定是否为负数
2.其次在对借位数为负的情况处理 (t+10)%10
3.最后对前导0进行处理
int类型的I与A.size()比较可能会有int 和 unsigned 报错需强制类型转换
#include <iostream>
#include <vector>
using namespace std;
// A>B
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;
}
// C = A - B;
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(B.size()>i)
t = t - B[i];
//处理C为负数
C.push_back((t+10)%10);
//判断借位
if(t<0)
t = 1;
else
t = 0;
}
//将C的前导0去除
while(C.size() > 1&&C.back()==0)
C.pop_back();
return C;
}
int main()
{
string a,b;
vector<int> A,B;
//'123456'
cin>>a>>b;
//[6,5,4,3,2,1]
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');
//A>=B则计算A-B,否则计算-(B-A)
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;
}