高精度减法思路可以参照我的上一篇文章,采用小学的竖式减法进行实现。但与高精度加法不同的是,高精度减法需要考虑借位问题,如下图:
从个位开始按位相减,不够借位,直到最高位结束。这个过程我们仍用数组来模拟,思路如下:
1.创建数组分别用来储存被减数,减数,差。
2.模拟竖式减法运算。
3.输出结果
以下为代码:
1.创建数组存储所需数字
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//创建数组存储所需数字
cin>>a>>b;//输入
lena = strlen(a);
lenb = strlen(b);//获取长度
if(lena<lenb || strcmp(b,a)>0){
swap(lena,lenb);
swap(a,b);
cout<<"-";
}//判断数组大小并交换
for(int i=0;i<lena;i++){
a1[lena-i-1] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i-1] = b[i]-48;
} // 逆序存储
这里与加法不同的点是:我们要考虑结果可能有负数存在,所以提前判断数组大小,并在减数比被减数大时交换数组输出负号。
2.模拟竖式减法
int lenc=0;//声明差数组长度
while(lenc<lena){
if(a1[lenc]<b1[lenc]){
a1[lenc]+=10;
a1[lenc+1]--;
}//模拟借位
c1[lenc] = a1[lenc]-b1[lenc];
lenc++;
}
while(c1[lenc]==0 && lenc>1){
lenc--;
}//删除高位零
模拟借位,当当前数字不够减时就加上10,并且使前一位减1。要注意的是,高精度减法可能会出现高位零需要删除。如不删可能会出现以下情况:
10-10=000
这样明显不符合我们的阅读习惯,所以要删除多余的0,但又要注意lenc(也就是c数组的长度)必须大于1,因为10-10=0;在结果全是0的情况下必须留一个0。
3.输出
for(int i=lenc;i>=0;i--){
cout<<c1[i];
}//逆序输出
因为是逆序储存所以逆序输出。
最后是该算法的完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//创建数组存储所需数字
cin>>a>>b;//输入
lena = strlen(a);
lenb = strlen(b);//获取长度
if(lena<lenb || strcmp(b,a)>0){
swap(lena,lenb);
swap(a,b);
cout<<"-" ;
}//判断数组大小并交换
for(int i=0;i<lena;i++){
a1[lena-i-1] = a[i]-48;
}
for(int i=0;i<lenb;i++){
b1[lenb-i-1] = b[i]-48;
} // 逆序存储
int lenc=0;//声明差数组长度
while(lenc<lena){
if(a1[lenc]<b1[lenc]){
a1[lenc]+=10;
a1[lenc+1]--;
}//模拟借位
c1[lenc] = a1[lenc]-b1[lenc];
lenc++;
}
while(c1[lenc]==0 && lenc>1){
lenc--;
}//删除高位零
for(int i=lenc;i>=0;i--){
cout<<c1[i];
}//逆序输出
return 0;
}
下期更新高精度除法。