高精度负数加减法

 没错,高精度负数加减法出现了!!!输入方式:先是两个数字,最后是符号。

运行结果:

代码: 

#include <bits/stdc++.h>
using namespace std;
string cs(string s){
	for(int i=0;i<s.size();i++)
	if(s[i]!='-'&&(s[i]<'0'||s[i]>'9')){
		s.erase(i,1);
		i--;
	}
	while(s[0]=='0'&&s.size()>1)s.erase(0,1);
	return s;
}
string jianfa(string s,string s1){
	string sk="";
	int a[1001],b[1001],c[1001];
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	int la=s.size(),lb=s1.size();
	if(la<lb||la==lb&&s<s1){
		swap(s,s1);
		swap(la,lb);
		sk="-";
	}
	for(int i=0;i<la;i++)
	a[i]=s[la-i-1]-48;
	for(int i=0;i<lb;i++)
	b[i]=s1[lb-i-1]-48;
	int len=max(la,lb);
	for(int i=0;i<len;i++){
		if(a[i]<b[i]){
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];
	}
	while(c[len]==0&&len>0){
		len--;
	}
	for(int i=len;i>=0;i--){
		char g=c[i]+'0';
		sk+=g;
	}
	return sk;
}
string jiafa(string s,string s1){
	int a[1000],b[1000],c[1000];
	bool as=0;
	int la=s.size(),lb=s1.size();
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	for(int i=0;i<la;i++)
	a[i]=s[la-i-1]-'0';
	for(int i=0;i<lb;i++)
	b[i]=s1[lb-i-1]-'0';
	int len=max(la,lb);
	for(int i=0;i<len;i++){
		c[i]=a[i]+b[i]+c[i];
		if(c[i]>9){
			c[i+1]=c[i]/10;
			c[i]%=10;
		}
	}
	int h=len+9;
	while(c[h]==0)h--;
	string ss="";
	for(int i=h;i>=0;i--){
		char qw=c[i]+'0';
		ss+=qw;
	}
	return ss;
}
string jjf(string s,string s1,char c){
	s=cs(s);
	s1=cs(s1);
	if(c=='+'){
		if(s[0]=='-'){
			if(s1[0]=='-')//-6+-3 -6-3 -9
			{
				s.erase(0,1);
				s1.erase(0,1);
				string st=jiafa(s,s1),k="-";
				k+=st;
				return k;
			}
			else{//-3+6 -6+3
				s.erase(0,1);
				string k,sk;
				k=jianfa(s,s1);
				if(k[0]=='-'){
					k.erase(0,1);
					sk=k;
				}
				else
				sk="-"+k;
				return sk;
			}
		}
		else{
			if(s1[0]=='-')//6+-3 3+-6
			{
				s1.erase(0,1);
				return jianfa(s,s1);
				
			}
			else
			return jiafa(s,s1);
		}
	}
	else{
		if(s[0]=='-'){
			if(s1[0]=='-'){//-6--3 -6+3
				s.erase(0,1);
				s1.erase(0,1);
				string k,sk;
				k=jianfa(s,s1);
				if(k[0]=='-'){
					k.erase(0,1);
					sk=k;
				}
				else
				sk="-"+k;
				return sk;
			}
			else{//-6-3 -3-6
				s.erase(0,1);
				return "-"+jiafa(s,s1);
			}
		}
		else{
			if(s1[0]=='-')//6--3 3--6
			{
				s1.erase(0,1);
				return jiafa(s,s1);
			}
			else{//6-3
				return jianfa(s,s1);
			}
		}
	}
}
int main(){
	char c;
	string s,s1;
	cin>>s>>s1>>c;
	cout<<jjf(s,s1,c);
	return 0;
}

虽然有点长,但还是很实用的

猜你喜欢

转载自blog.csdn.net/yyf525/article/details/121046071
今日推荐