究极高精减(可多次调用,可处理负数)

不会高精加的先看这个

高精度运算(蒟蒻的学习脚印)-CSDN博客

#include<bits/stdc++.h>
using namespace std;
string aa,bb;
string addfunc(string a,string b)//高精度加法 
{
	string sum;
	int arr[50000]={0},brr[50000]={0},crr[50001]={0};
	for(int i=a.size();i>0;--i)
    arr[i]=a[a.size()-i]-'0';
    for(int i=b.size();i>0;--i)
    brr[i]=b[b.size()-i]-'0';
    int maxl=max(a.size(),b.size());
    for(int i=1;i<=maxl;++i)
    {
    	crr[i]+=arr[i]+brr[i];
    	if(crr[i]>9)
    	{
    		crr[i+1]+=1;
    		crr[i]%=10;
		}
	}
	if(crr[maxl+1]!=0)
	{
		sum+='1';
	}
	for(int i=maxl;i>0;--i)
	{
		sum+=crr[i]+'0';
	}
	return sum;
}
string tsubfunc(string a,string b)//高精度减法 
{
	if((b>a&&a.size()==b.size())||(b.size()>a.size()))
	swap(a,b);
    string sum;
	int arr[50000]={0},brr[50000]={0},crr[50001]={0};
	for(int i=a.size();i>0;--i)
    arr[i]=a[a.size()-i]-'0';
    for(int i=b.size();i>0;--i)
    brr[i]=b[b.size()-i]-'0';
    int maxl=max(a.size(),b.size());
    for(int i=1;i<=maxl;++i)
    {
    	if(arr[i]<brr[i])
    	{
    		arr[i+1]-=1;
    		arr[i]+=10;
		}
		crr[i]=arr[i]-brr[i];
	}
	int x;
	for(int i=maxl;i>0;--i)
	{
		if(crr[i]!=0)
		{
			x=i;
			break;
		}
	}
	for(int i=x;i>0;--i)
	{
		sum+=crr[i]+'0';
	}
	return sum;
}
string subfunc(string a,string b)
{
	if(a==b)//分类讨论 
	return "0";
	string sum;
	if(((b>a&&a.size()==b.size())||(b.size()>a.size()))&&(a[0]!='-'&&b[0]!='-'))//判断得数正负 
	{
		sum=tsubfunc(a,b);
		return '-'+sum;
	}
	if(((a>b&&a.size()==b.size())||(a.size()>b.size()))&&(a[0]!='-'&&b[0]!='-'))
	{
		sum=tsubfunc(a,b);
		return sum;
	}
	if(((b>a&&a.size()==b.size())||(b.size()>a.size()))&&(a[0]=='-'&&b[0]=='-'))
	{
		sum=tsubfunc(a,b);
		return sum;
	}
	if(((a>b&&a.size()==b.size())||(a.size()>b.size()))&&(a[0]=='-'&&b[0]=='-'))
	{
		sum=tsubfunc(a,b);
		return '-'+sum;
	}
	if(a[0]=='-'&&b[0]!='-')//一正一负转加法 
	{
		a.erase(0,1);
		sum=addfunc(a,b);
		return '-'+sum;
	}
	if(a[0]!='-'&&b[0]=='-')
	{
		b.erase(0,1);
		sum=addfunc(a,b);
		return sum;
	}
}
int main()
{
	cin>>aa>>bb;
	string c=subfunc(aa,bb);
	cout<<c;
	return 0;
}

不多说,相信能看懂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值