高精度减法可以类比加法,模拟竖式计算。要点不多,主要注意各数位对齐,小数减大数向高位借一。
一、定义数组
这一步不用多说,需要被减数A、减数B、借位存储C、差Ans四个数组,以及A的长度Len_A、B的长度Len_B、商的长度Len_Ans。
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
二、读入数据
这里我定义了一个函数,将数据用string类型输入,然后反向存储到数组中。
void Read(int *A,int &Len){
string cur;
cin>>cur;
len=cur.length();
for(int i=0;i<len;i++)A[i]=cur[i]-48;
reverse(A,A+Len);//reverse函数是C++中的翻转函数,传入的两个参数代表反转的左闭右开区间。
}
三、减法操作
首先在A的长度与B的长度中选出一个最大值,作为差的长度。
然后循环进行减法、借位操作。
Len_Ans=max(Len_A,Len_B);
for(int i=0;i<Len_Ans;i++){
Ans[i]=A[i]-B[i]-C[i];
if(Ans[i]<0)c[i+1]++,Ans[i]+=10;//借位操作
}
四、删除前导零&&输出
while循环判断最后一位是否为零,差的长度减一。
for循环输出
while(Len_Ans>1&&Ans[Len_Ans-1]==0)//判断位数是否减少
Len_Ans--;
for(int i=Len_Ans-1;i>=0;i--)
cout<<Ans[i];
代码展示
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
void Read(int *A,int &Len){
string sur;
cin>>sur;
Len=sur.length();
for(int i=0;i<Len;i++)A[i]=sur[i]-48;
reverse(A,A+Len);
}
int main(){
Read(A,Len_A);
Read(B,Len_B);
Len_Ans=max(Len_A,Len_B);
for(int i=0;i<Len_Ans;i++){
Ans[i]=A[i]-B[i]-C[i];
if(Ans[i]<0)C[i+1]++,Ans[i]+=10;
}
while(Len_Ans>1&&Ans[Len_Ans-1]==0)Len_Ans--;
for(int i=Len_Ans-1;i>=0;i--){
cout<<Ans[i];
}
return 0;
}