题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
$1≤整数长度≤105$
输入样例:
32
11
输出样例:
21
思路
除了模板外,其实还有一部分重要的代码
就是我们还要写一个比较函数来判断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 1;
}
本题的要求是两个正整数,如果有有负数的话就判断两个输入的字符串取一个字符是不是’-‘,然后进行标记,然后再转换成两个数的绝对值的和或者差
我们在加上进位的时候,如果A[i]-B[i]-t≥0,那么下一次加的就是t,否则加的是t+10
而这种情况我们可以缩减成一句话(t+10)%10
如果t≥0,结果就是t,如果t<0结果就是t+10
接着判断有没有借位,方便下一层循环的进行
代码
#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 1;
}
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()
{
vector<int> A,B,C;
string 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))
{
C=sub(A,B);
}
else
{
C=sub(B,A);
cout<<'-';
}
for(int i=C.size()-1;i>=0;i--)
{
cout<<C[i];
}
return 0;
}
附:高精度减法 —— 模板题 AcWing 792. 高精度减法
// C = A - B, 满足A >= B, A >= 0, B >= 0
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;
}