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

高精度减法 【c++实现】,第1张

高精度减法实现

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

可能遇到的问题:

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

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

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

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

如下样例:

这样子直接计算 a - b ,肯定不行,所以我们就要分成两种情况:

  1. a > b
    直接计算就好了,对位相减, 做好借位就没问题。
  2. a < b
    这个时候,负数了,所以要做 b - a ,保证结果是整数,同时用一个变量(我用的flag记录,flag==1表示结果为负)记录正负。

具体详解都写在代码注释里了,这里就不再多赘述了(真的是几乎每一行都写了注释)。

代码如下:
#include 
#include 
#include 
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[len_a-1]>=b[len_b-1]){ //当 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啦!
看完点个赞可以嘛,你的点赞是博主更新的最大动力!!!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/789444.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存