大数乘法

string BigNum :: BigMul(string s1, string s2)
{
 char ct;
 int *n;
 int b, i, j, f, f1, l1, l2, sl1, sl2, t, t1, t2;
 string st, st1, st2;
 
 //cin>>s1;
 //cin>>s2;

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

 for(i=0, b=0, f=0, f1=0, sl1=0; i<l1; ++i)// 转换为不带符号的大整数
 {
  if(s1[i]=='-')// 除符号并进行相应记录
  {
   ++f;
   continue;
  }

  if(s1[i]=='.')// 除小数点并进行相应记录
  {
   f1 = 1;
  }
  else
  {
   if(b==0&&f1==0)// 除整数部分首0
   {
    if(s1[i]!='0')
    {
     st1 += s1[i];
     b = 1;
    }
   }
   else
   {
    st1 += s1[i];
   }

   if(f1==1)// 记录小数位数
   {
    ++sl1;
   }
  }
 }

 for(i=0, b=0, f1=0, sl2=0; i<l2; ++i)// 转换为不带符号的大整数
 {
  if(s2[i]=='-')// 除符号并进行相应记录
  {
   ++f;
   continue;
  }

  if(s2[i]=='.')// 除小数点并进行相应记录
  {
   f1 = 1;
  }
  else
  {
   if(b==0&&f1==0)// 除整数部分首0
   {
    if(s2[i]!='0')
    {
     st2 += s2[i];
     b = 1;
    }
   }
   else
   {
    st2 += s2[i];
   }

   if(f1==1)// 记录小数位数
   {
    ++sl2;
   }
  }
 }

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

 l1 = st1.size();
 l2 = st2.size();

 st = st1;
 st1.erase(0, l1);

 for(i=l1-1; i>=0; --i)// 反序(从最低位开始乘)
 {
  st1 += st[i];
 }

 st = st2;
 st2.erase(0, l2);

 for(i=l2-1; i>=0; --i)// 反序(从最低位开始乘)
 {
  st2 += st[i];
 }

 st.erase(0, l2);

 n = new int[l1+l2+1];

 for(i=0; i<l1+l2+1; ++i)
 {
  n[i] = 0;
 }

 for(j=0; j<l2; ++j)// 乘数的每一位
 {
  t2 = st2[j] - '0';// 字符数字转换为整型数字

  if(t2!=0)
  {
   for(i=0; i<l1; ++i)// 被乘数的每一位
   {
    t1 = st1[i] - '0';// 字符数字转换为整型数字
    t = t1 * t2;// 两数相乘

    if(t>9)// 大于9则进位
    {
     n[i+j+1] = n[i+j+1] + t/10;
     t = t % 10;
    }

    n[i+j] = n[i+j] + t;
   }
  }
 }

 for(i=0; i<l1+l2; ++i)// 对计算过程中产生的大于9的结果进行处理
 {
  if(n[i]>9)
  {
   n[i+1] = n[i+1] + n[i]/10;
   n[i] = n[i] % 10;
  }
 }

 if(f==1)// 异号相乘
 {
  s1 += '-';
 }

 for(i=0, j=sl1+sl2, b=0; j>0; ++i, --j)// 小数部分入st
 {
  if(b==0)// 除小数部分尾0
  {
   if(n[i]!=0)
   {
    b = 1;
    itoa(n[i], &ct, 10);// 整型数字转换为字符型数字
    st += ct;
   }
  }
  else
  {
   itoa(n[i], &ct, 10);// 整型数字转换为字符型数字
   st += ct;
  }
 }

 if(i!=0)// 有小数在相应位置添加小数点
 {
  st += '.';
 }

 for(b=0; i<l1+l2; ++i)// 整数部分入st
 {
  itoa(n[i], &ct, 10);// 整型数字转换为字符型数字
  st += ct;
  b = 1;
 }

 if(b==0)// 整数部分为0补0
 {
  st += '0';
 }

 for(i=st.size()-1; i>=0; --i)// st反序入s1
 {
  if(i==0&&st[i]=='.')// 防止“5000.”情况
  {
   break;
  }

  if(b==1)// 除整数部分首0
  {
   if(st[i]!='0')
   {
    b = 0;
    s1 += st[i];
   }
  }
  else
  {
   s1 += st[i];
  }
 }

 delete[] n;

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值