您的位置:首页 > 其它

大数加法

2010-04-01 22:44 204 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: