其他分享
首页 > 其他分享> > 高精度减法

高精度减法

作者:互联网

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;
}

标签:存储,高精度,int,s2,s1,借位,字符串,减法
来源: https://blog.csdn.net/m0_54621932/article/details/113796887