高精度减法实现
其他高精度算法如下:
高精度加法 【c++实现】
高精度乘法【c++实现】
高精度除法【c++实现】
——————————————————————————
大家学过高精度加法之后,想必一定想知道高精度减法怎么实现了吧!
高精度加法和加法有共同之处,比如倒序储存······
什么?你说你没学过高精度加法?快来看这里(非常详细哦)–>高精度加法 【c++实现】
在此特别感谢Gordon_Chao在评论区指出错误,现已进行更改。
可能遇到的问题:
减法里需要注意的就是负数问题了!其他和加法一样。
对位相减的时候减出来是负数咋办?
很简单,高位减一,本位加10
计算 a - b 的时候如果 a < b ,减出来是个负数咋办?
如下样例:
这样子直接计算 a - b ,肯定不行,所以我们就要分成两种情况:
- a > b
直接计算就好了,对位相减, 做好借位就没问题。 - a < b
这个时候,负数了,所以要做 b - a ,保证结果是整数,同时用一个变量(我用的flag记录,flag==1表示结果为负)记录正负。
具体详解都写在代码注释里了,这里就不再多赘述了(真的是几乎每一行都写了注释)。
代码如下:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main(){
//计算 a - b = ans
int i,j,flag=0; //flag用来记录是否为负数, 1代表负数, 默认为0即正数
string a_s,b_s; //用字符串接受两个数字
int a[521]={0},b[521]={0},ans[521]={0}; //三个存数字数组, 记得初始化为0
cin>>a_s>>b_s; //接受输入的字符串型 a 和 b 存到 a_s 和 b_s 里
int len_a=a_s.length(),len_b=b_s.length(); //计算 a 和 b 的长度
int len=len_a>len_b?len_a:len_b; //计算 a 和 b 的最大长度, 确定做减法时的循环次数
for(i=0;i<len_a;i++) a[i]=a_s[len_a-1-i]-'0'; //将字符型数字转化为整形数字
for(i=0;i<len_b;i++) b[i]=b_s[len_b-1-i]-'0'; //注意要倒序存储, 后面输出的时候再倒一遍
if(len_a>len_b||len_a==len_b&&a_s>=b_s){ //当 a 大于等于 b 时
for(i=0;i<len;i++){
if(a[i]<b[i]){ //当对应位 a < b 时, 向高位借位
a[i+1]--; //高位减1
a[i]+=10; //这一位加10
}
ans[i]=a[i]-b[i]; //做减法
}
}
else{ //当 a 小于 b 时, a - b 为负数, 所以变为 b - a, 保证减法结果为正
flag=1; //负数标记
for(i=0;i<len;i++){
if(b[i]<a[i]){ //借位
b[i+1]--;
b[i]+=10;
}
ans[i]=b[i]-a[i];
}
}
if(flag) cout<<"-"; //输出负号
while(ans[len]==0&&len>0) len--; //去掉前置无用的 0
for(i=len;i>=0;i--){ //倒序输出结果
cout<<ans[i];
}
}
OK啦!
看完点个赞可以嘛,你的点赞是博主更新的最大动力!!!