高精度减法(适用于各种情况)

我们将高精度减法写成了一个子函数,方便在做题的时候调用。
代码:

#include<bits/stdc++.h>
#include<math.h>
#include<iostream>
using namespace std;
const int N = 11000;
string a , b;
string _add(string a , string b)
{
	string sum;
	int na[N] = {0};
	int nb[N] = {0};
	int ans[N+1] = {0};
	for(int i = a.size() ; i > 0 ; i--)
	{
		na[i] = a[a.size()-i] - '0';
	}
	for(int i = b.size() ; i > 0 ; i--)
	{
		nb[i] = b[b.size()-i] - '0';
	}
	int max1 = max(a.size() , b.size());
	for(int i = 1 ; i <= max1 ; i++)
	{
		ans[i+1] = (ans[i]+na[i]+nb[i])/10;
		ans[i] = (ans[i]+na[i]+nb[i])%10;
	}
	if(ans[max1+1]!=0)
	  sum+="1";
	for(int i = max1 ; i > 0 ; i--)
	{
		sum+=ans[i]+'0';
	}
	return sum;
}
string _minus(string a , string b)
{
	int na[N] = {0};
	int nb[N] = {0};
	int ans[N] = {0};
	string diff;
	if((a < b&&a.size()<=b.size())||b.size()>a.size())
	   return "-"+_minus(b,a);
	for(int i = a.size();i>0;i--)
	  na[i] = a[a.size()-i]-'0';
	for(int i = b.size();i>0;i--)
	  nb[i] = b[b.size()-i]-'0';
	int max1 = max(a.size(),b.size());
	for(int i = 1 ; i <= max1 ; i++)
	{
		if(na[i] < nb[i])
		{
			na[i+1]--;
			na[i]+=10;
		}
		ans[i] = na[i]-nb[i];
	}
	while(ans[max1] == 0)
	  max1--;
	if(max1 < 1)
	  return "0";
	for(int i = max1 ; i > 0 ; i--)
	{
		diff+=ans[i]+'0';
	}
	return diff;
}
int main()
{
	string a , b;
	cin >> a >> b;
	if(a[0]=='-'&&b[0]=='-')
	{
		a.erase(0,1);
		b.erase(0,1);//将a,b打头的负号弄掉再进行运算
		cout << _minus(b,a);
		return 0; 
	}
	else if(a[0]=='-')
	{
		a.erase(0,1);
		cout << '-' << _add(a,b);
		return 0;
	}
	else if(b[0]=='-')
	{
		b.erase(0,1);
		cout << _add(a,b);
		return 0;
	}
	else
	  cout << _minus(a,b)<< endl;
	return 0;
}

发布了107 篇原创文章 · 获赞 3 · 访问量 7122

猜你喜欢

转载自blog.csdn.net/qq_43504141/article/details/103281858
今日推荐