大数加减法的string类实现

#include <iostream>
#include <vector>
#include<string>


#include<algorithm>


using namespace std;


string add(string a1,string a2)                                                          //符号相同时加法的运算
{
int length1=a1.size();
int length2=a2.size();
    int maxLength=length1>length2 ? length1:length2;
bool isNegative=false;
string result(maxLength+2,'0');                                               //可能会产生进位


result[maxLength+1]='\0';





    if(a1[0]=='-'&&a2[0]=='-')                                                            //判断两数都为正还是都为负
isNegative=true;




int sum=0;
bool flag=0;
int i,j;
int k=maxLength;





for( i=length1-1,j=length2-1;i>=0&&j>=0;i--,j--)                       //利用字符实现整数加法含进位
{
if((a1[i]=='-')||(a2[j]=='-'))
{
break;
}
sum=a1[i]-'0'+a2[j]-'0'+flag;

if(sum>=10)
{
flag=1;
sum-=10;
result[k]=sum+'0';
k--;
}
else
{
result[k]=sum+'0';
flag=0;
k--;
}
}
  
for(;i>=0 && a1[i]!='-';i--)                        //a1 长
{
sum=a1[i]-'0'+flag;


if(sum>=10)
{
flag=1;
sum-=10;
result[k]=sum+'0';
   k--;
}

else
{
result[k]=sum+'0';
flag=0;
k--;
}
}


for(;j>=0 && a2[j]!='-';j--)                          //a2 长
{
sum=a2[j]-'0'+flag;


if(sum>=10)
{
flag=1;
sum-=10;
result[k]=sum+'0';
   k--;
}

else
{
result[k]=sum+'0';
flag=0;
k--;
}
}


if(flag==1)
{

if(k>=0)
result[k]='1';
}
else
result.erase(0,1);


if(isNegative)
result[0]='-';


return result;
}


















string sub(string a1,string a2)                                                                   //符号相异时实现加法运算,也就是减法
{


int length1=a1.size();
int length2=a2.size();
string result1;


string Max,Min;


bool formerbig=true;
bool formerNegative=false;                                                        //判断前面的数的绝对值是否比后面的大,并且记录前面的时正数还是负数


if(a1[0]=='-')
{
formerNegative=true;
string b1(a1);
b1.erase(0,1);


//cout<<"**********************************************"<<endl;


//cout<<b1<<endl;


        int compareA1A2;


if(b1.size()==a2.size())
{
   compareA1A2=b1.compare(a2);
}
else if(b1.size()>a2.size())
{
compareA1A2=1;
}
else
             compareA1A2=-1;






    if(compareA1A2==0)
    {
    result1.push_back('0');
return result1;
    }
else if(compareA1A2<0)
{
formerbig=false;
Max=a2;
Min=b1;
}
else
{
Max=b1;
Min=a2;
}
// cout<<"Max:"<<Max<<" "<<"Min: "<<Min<<endl;                           找出绝对值大的和绝对值小的
}




if(a2[0]=='-')
{
formerNegative=false;
string b2(a2);
b2.erase(0,1);
        int compareA1A2;


if(b2.size()==a1.size())
{
   compareA1A2=b2.compare(a1);
}


else if(b2.size()>a1.size())
{
compareA1A2=1;
}


else
compareA1A2=-1;




    if(compareA1A2==0)
    {
    result1.push_back('0');
return result1;
    }
else if(compareA1A2>0)
{
formerbig=false;
Max=b2;
Min=a1;
}
else
{
Max=a1;
Min=b2;
}
 
}






int MaxLength=Max.size();
int MinLength=Min.size();
    string result(MaxLength+1,'0');
result[MaxLength]='\0';


int flag=0;
int  subtract=0;


int i,j;
int k=MaxLength-1;


int maxwei,minwei;


for(i=MaxLength-1,j=MinLength-1;i>=0&&j>=0;i--,j--)
{
            maxwei=Max[i]-'0';
minwei=Min[j]-'0';


if(maxwei-flag>=minwei)
{
subtract=maxwei-minwei-flag;
flag=0;
}
else
{

maxwei+=10;


subtract=maxwei-minwei-flag;


flag=1;
}
result[k--]=subtract+'0';
}





for(;i>=0;i--)
{
maxwei=Max[i]-'0';
if(maxwei-flag>=0)
{
subtract=maxwei-flag;
flag=0;
}
else
{

maxwei+=10;


subtract=maxwei-flag;


flag=1;
}
result[k--]=subtract+'0';
}
cout<<"result:"<<result<<endl;


string::iterator del_zero=result.begin();


int count=0;


for(i=0;i<(int)result.size();i++)
{
if(result[i]=='0')
count++;
else 
break;
}


if(count>0)
result.erase(del_zero,del_zero+count);                             //去除结果前面的0





     if(formerbig)                                                                                     // 再得到结果前插入符号
      {
      if(!formerNegative)


return result;


else
{

string::iterator first_pos=result.begin();
result.insert(first_pos,'-');
return result;
}
      }
else
{
if(!formerNegative)
{
string::iterator first_pos=result.begin();
result.insert(first_pos,'-');
return result;
}
else
return result;
}


}






















string add_lei(string a1,string a2)                                         //调用前面两个函数实现真正的加法运算
{
string result;
if(a1[0]=='-')
{
if(a2[0]=='-')
result=add(a1,a2);
else
result=sub(a1,a2);
}
else
{
if(a2[0]=='-')
result=sub(a1,a2);
else
result=add(a1,a2);
}
return  result;
}








int main(void)
{
   while(1)
   {
string a1,a2;
string result;
cin>>a1>>a2;


cout<<endl;


cout<<a1<<" "<<a2<<endl;
result=add_lei(a1,a2);
cout<<result<<endl;
   }
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值