高精度减法 【c++实现】

高精度减法实现

其他高精度算法如下:
高精度加法 【c++实现】
高精度乘法【c++实现】
高精度除法【c++实现】
——————————————————————————
大家学过高精度加法之后,想必一定想知道高精度减法怎么实现了吧!
高精度加法和加法有共同之处,比如倒序储存······
什么?你说你没学过高精度加法?快来看这里(非常详细哦)–>高精度加法 【c++实现】

在此特别感谢Gordon_Chao在评论区指出错误,现已进行更改。

可能遇到的问题:

减法里需要注意的就是负数问题了!其他和加法一样。

对位相减的时候减出来是负数咋办?

很简单,高位减一,本位加10

计算 a - b 的时候如果 a < b ,减出来是个负数咋办?

如下样例:
在这里插入图片描述
这样子直接计算 a - b ,肯定不行,所以我们就要分成两种情况:

  1. a > b
    直接计算就好了,对位相减, 做好借位就没问题。
  2. 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啦!
看完点个赞可以嘛,你的点赞是博主更新的最大动力!!!

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值