大数加减法,使用string类型来表示数字
//思路:
1):对于两个正数或者是负数相加,则直接相加
2):负数加上正数,则相当于正数减去负数
代码如下:
/**
大整数的加减法
*/
#include <iostream>
#include <string>
using namespace std;
int myminus=0;//0 表示没有负号,1表示有
string bignumdel(string str1,string str2);
string bignumAdd(string str1,string str2)
{
int len1=str1.length();
int len2=str2.length();
if(len1==0)
return str2;
if(len2==0)
return str1;
if(str1[0]=='-' && str2[0]=='-')
{
myminus=1;
str1.erase(0,1);str2.erase(0,1);
return bignumAdd(str1,str2);
}
else if(str1[0]=='-' && str2[0]!='-')
{
str1.erase(0,1);
return bignumdel(str2,str1);
}
else if(str1[0]!='-' && str2[0]=='-')
{
str2.erase(0,1);
return bignumdel(str1,str2);
}
//add
int maxlen=len1;
string result;
if(len1>len2)
{
maxlen=len1;
for(int i=0;i<(len1-len2);i++)
{
str2='0'+str2;
}
}
else if(len2>len1)
{
maxlen=len2;
for(int i=0;i<(len2-len1);i++)
{
str1='0'+str1;
}
}
int takeover=0;
for(int i=maxlen-1;i>=0;i--)
{
int tmp=(str1[i]-'0')+(str2[i]-'0')+takeover;
takeover=0;
if(tmp>=10)
{
tmp=tmp%10;
takeover=1;
}
char ch=('0'+tmp);
result= ch +result;
}
if(takeover==1)
result='1'+result;
return result;
}
string bignumdel(string str1,string str2)
{
int len1=str1.length();
int len2=str2.length();
if(len1>len2)
{
for(int i=0;i<len1-len2;i++)
str2='0'+str2;
}
else if(len2>len1)
{
for(int i=0;i<len2-len1;i++)
str1='0'+str1;
myminus=1;
return bignumdel(str2,str1);
}
else if(len1==len2)
{
if(str1<str2)
{
myminus=1;
return bignumdel(str2,str1);
}
}
//del
int takeover=0;
string result;
for(int i=len1-1;i>=0;i--)
{
int tmp=(str1[i]-'0')-(str2[i]-'0')-takeover;
if(tmp<0)
{
tmp=(str1[i]-'0')-(str2[i]-'0')+10-takeover;
takeover=1;
}
char ch='0'+tmp;
result= ch +result;
}
return result;
}
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
string res=bignumAdd(str1,str2);
if(myminus==1)
printf("-");
int len=res.length();
int i=0;
while((i++)<len)//除0前缀
{
if(res[0]=='0')
{
res.erase(0,1);
}
else break;
}
cout<<res<<endl;
myminus=0;
}
return 0;
}