思路:
①首先输入字符串a,b;
②然后再创建动态数组,经行倒着存贮;
③减法不同于加法和乘法只比较字符串的长度,减法计算中存在着很多的坑:长度长的字符串一定大于短的字符串;长度一致的字符串,不一定相等,所以需要开循环进行比较,直到比较出现不一样的字符为止,我们这里判断是返回的第一个字符是否大于等于第二个字符,如果是则返回真,反之,返回否;
④倒着输出会出现前导零的情况,所以需要开循环去掉前导零;
⑤因为我们是倒着相加的,所以输出也要是倒着输出结果,同时我们在写程序计算时是保证第一个数大于第二个数的,所以结果都是正数,所以在判断大小时需要判断输出时是否需要加负号!
例题:
https://www.luogu.com.cn/problem/P2142
洛谷高精度减法
#include <bits/stdc++.h>
using namespace std;
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-=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;
}
bool cmp(vector<int>&A,vector<int>&B){
//字符串长度不相等的情况
if(A.size()!=B.size())return A>B;
//字符串长度相等的情况
//结束循环的条件就是知道出现两个字符不相等的情况
for(int i=0;i<A.size();i++){
if(A[i]!=B[i])return A[i]>B[i];
}
//如果两个字符串长度和字符一模一样
return true;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B,C;
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);
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
}else{
C=sub(B,A);
printf("-");
for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
}
return 0;
}