没错,高精度负数加减法出现了!!!输入方式:先是两个数字,最后是符号。
运行结果:
代码:
#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;
}
虽然有点长,但还是很实用的