大数加法

来源:互联网 发布:淘宝代运营被骗案判例 编辑:程序博客网 时间:2024/04/29 12:31

string BigNum :: BigAdd(string s1, string s2)
{
 int b, f, i, j, t, t1, t2, l, l1, l2;
 char ct;
 string s11, s12, s21, s22, st1, st2;

 //cin>>s1;
 //cin>>s2;

 l1 = s1.size();
 l2 = s2.size();

 for(i=0, f=0, b=0; i<l1; ++i)
 {
  if(b==0)
  {
   if(s1[i]=='0'&&i<l1&&s1[i+1]!='.')// 被加数整数部分除前0--保留小数点前一个0
   {
    continue;
   }
   else
   {
    b = 1;
   }
  }

  if(s1[i]=='.')
  {
   f = 1;
   continue;
  }

  if(f==0)// 整数部分
  {
   s11 += s1[i];
  }
  else// 小数部分
  {
   s12 += s1[i];
  }
 }

 for(i=0, f=0, b=0; i<l2; ++i)
 {
  if(b==0)
  {
   if(s2[i]=='0'&&i<l2&&s2[i+1]!='.')// 加数整数部分除前0--保留小数点前一个0
   {
    continue;
   }
   else
   {
    b = 1;
   }
  }

  if(s2[i]=='.')
  {
   f = 1;
   continue;
  }

  if(f==0)// 整数部分
  {
   s21 += s2[i];
  }
  else// 小数部分
  {
   s22 += s2[i];
  }
 }

 s1.erase(0, l1);
 s2.erase(0, l2);

 l1 = s12.size()-1;
 l2 = s22.size()-1;
 f = 0;
 b = 0;

 while(l1>=0)// 小数部分加法--由最低位向上加
 {
  if(l1>l2)// 被加数小数部分长度大--直接加(除小数末尾0)
  {
   if(b==1)
   {
    st2 += s12[l1];
   }
   else
   {
    if(s12[l1]!='0')// 除末尾0
    {
     st2 += s12[l1];
     b = 1;
    }
   }
   
   --l1;
   continue;
  }
  else if(l1<l2)// 加数小数部分长度大--直接加(除小数末尾0)
  {
   if(b==1)
   {
    st2 += s22[l2];
   }
   else
   {
    if(s22[l2]!='0')// 除小数末尾0
    {
     st2 += s22[l2];
     b = 1;
    }
   }

   --l2;
   continue;
  }
  else
  {
   t1 = s12[l1] - '0';// 字符型数字转换为整型数字
   t2 = s22[l2] - '0';// 字符型数字转换为整型数字
   --l1;
   --l2;

   t = t1 + t2 + f;// 两数相加(包括进位符)
   f = 0;

   if(t>9)// 数和大于9--进位
   {
    f = 1;
    t = t % 10;
   }
   
   itoa(t, &ct, 10);// 整型数字转换为字符型数字
   st2 += ct;
  }
 }

 for(i=s11.size()-1, j=s21.size()-1; i>=0||j>=0; --i, --j)// 整数部分加法
 {
  if(i>=0)// 被加数整数部分还有数
  {
   t1 = s11[i] - '0';// 字符型数字转换为整型数字
  }
  else//  被加数整数部分没有数则补0
  {
   t1 = 0;
  }

  if(j>=0)// 加数整数部分还有数
  {
   t2 = s21[j] - '0';// 字符型数字转换为整型数字
  }
  else// 加数整数部分没有数则补0
  {
   t2 = 0;
  }

  t = t1 + t2 + f;// 两数相加(包括进位符)
  f = 0;

  if(t>9)// 数和大于9--进位
  {
   f = 1;
   t = t % 10;
  }
  
  itoa(t, &ct, 10);// 整型数字转换为字符型数字
  st1 += ct;
 }

 if(f==1)
 {
  itoa(f, &ct, 10);
  st1 += ct;
 }

 l = st1.size();

 for(i=l-1; i>=0; --i)// 整数部分和入s1
 {
  s1 += st1[i];
 }

 l = st2.size();
 
 if(l>0)// 有小数则加入'.'
 {
  s1 += '.';
 }

 for(i=l-1; i>=0; --i)// 小数部分和入s1
 {
  s1 += st2[i];
 }

 if(s1.empty())
 {
  s1 = "0";
 }

 //cout<<s1<<endl;
 return s1;
}

原创粉丝点击