高精度减法--C++题解

题目描述:

给出两个数a,b,求它们的差(可能为负)。

输入描述:

两行,两个数a,b(1≤a,b≤10^1000)。

输出描述:

一个数,表示它们的差。

输入样例:

99824
4353

输出样例:

95471


高精度减法,说明了用C++的long-long是肯定不行的,我们要换一种思路。

a和b可以一个个数位上的数依次相减,保存到最终的答案数组中。若不够,还是退位。那么,这段模拟减法的代码就是这样:

        if (a[i]<b[i]) {
			a[i+1]--;
			a[i]+=10;
		}
		c[i]=a[i]-b[i];
	

但是我们还是要考虑一个因素,那就是负数。当a-b不够减的时候,就可以计算b-a,只需要前面带一个负号就可以了,代码:

    if (len1<len2 || (len1==len2 && s1<s2)) {//当s1的长度不足s2或者s1<s2时,结果就是负数。
		cout<<"-";//输出负号
		string temp;//交换两个字符串
		temp=s1;
		s1=s2;
		s2=temp;
		len1=s1.size();//交换长度
		len2=s2.size();
	}

之后,字符串保存数组和原先的高精加一样,不讲了。但是,这里着重讲一下前导零。

1000-9=991,但是因代码原因,很有可能变成0991。在10进制中,是绝对不允许高位为0的!所以,最后可以再用一个for语句,来减少长度,从而避免这一个Bug。

那么,AC代码就是这样:

#include <bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1100];
string s1,s2;
int main() {
	cin>>s1>>s2;
	int len1=s1.size();
	int len2=s2.size();
	if (len1<len2 || (len1==len2 && s1<s2)) {
		cout<<"-";
		string temp;
		temp=s1;
		s1=s2;
		s2=temp;
		len1=s1.size();
		len2=s2.size();
	}
	for (int i=0;i<len1;i++) 
	 a[i]=s1[len1-i-1]-48;
	for (int i=0;i<len2;i++) 
	 b[i]=s2[len2-i-1]-48;
	for (int i=0;i<len1;i++) {
		if (a[i]<b[i]) {
			a[i+1]--;
			a[i]+=10;
		}
		c[i]=a[i]-b[i];
	}
	for (int i=len1-1;i>=0;i--) {
		if (c[i]==0) 
		 len1--;
		else break;
	}
	for (int i=len1-1;i>=0;i--) 
	 cout<<c[i];
	return 0;
}

好了,就分享到这里,觉得好的请点一个赞吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值