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;
}