高精度减法

C++中数据存储的范围是有限的,最长的longlong型最大只能存储2^63-1。如果要是需要存储更大的数就只能使用数组了。这样存储的数的运算需要另外编写程序。
这里介绍高精度减法
这种减法的运算类似于小学学习的竖式,从个位开始,逐位相加,如果不够则需借1。
首先我们需要先读入数据,这里使用一个字符串读入。
减法,存在被减数小于减数的情况,a-b=-(a-b),对于这种情况我们只要将被减数和减数交换,输出时加一个负号即可。那我们怎么判断它们的大小呢。以字符串的形式存储,无法直接比较,为了方便使用string存储字符串。先是比较它们的长度,如果不等,结果显然;如果相等,string类可以直接字符串比较,比较的是字典序,注意只有相等才可以这么比较(“1234”<“2”)。如果被减数小于减数,将二者交换,可以直接使用swap(s1,s2)。注意如果比较长度时,将其存储了,此时别忘了交换。
由于读入时首位是最大位,而运算时需要从个位开始,再将字符串反序的存储到一个整形数组之中,字符串的存储采用的是ASCII码,转换时,需要减去’0’。
接着就逐位相减即可,定义一个辅助变量,记录借位。注意,如果借位已经减掉了,记得置零。
最后就是输出,比如100001-100000,直接输出就是000001,需要去除前导零。另外如果是1-1,结果为一个零,不能去除
点击查看 高精度数的四则运算

代码

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

const int N=1e5;
string s1,s2;
int a[N],b[N],ans[N];

int main()
{
	cin>>s1>>s2;
	int sign=0;								//符号 
	int len1=s1.length();
	int len2=s2.length();
	if(len1<len2||(len1==len2&&s1<s2))		//判断大小 
	{
		sign=1;								//结果为负 
		swap(s1,s2);						//值交换 
		swap(len1,len2);					//长度交换 
	}
	for(int i=1;i<=len1;i++)
		a[i]=s1[len1-i]-'0';				//反序存储 
	for(int i=1;i<=len2;i++)
		b[i]=s2[len2-i]-'0';
	int len=max(len1,len2);					//答案长度最长为二者中最长的 
	int tmp=0;								//借位 
	for(int i=1;i<=len;i++)						
	{
		a[i]-=tmp;							//减去上一次的借位 
		tmp=0;								//借位用过了,置零 
		if(a[i]<b[i])
			tmp=1;							//此次借位,标记 
		ans[i]=a[i]+10*tmp-b[i];
	}
	int i;
	for(i=len;i>1;i--)						//除去前导0,但不能去除答案就为0的 
		if(ans[i]!=0)
			break;
	if(sign)								//负号 
		cout<<"-"; 
	for(;i;i--)
		cout<<ans[i];						//反序输出 
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值