大数加法
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;
}
{
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;
}
相关文章推荐
- [ACM Steps] Hat's Fibonacci 大数加法 另一种节约空间的方法
- 大数加法
- 大数加法 减法 乘法 除法 高精度四则运算
- 高精度算法-大数加法
- hdu 1502 Regular Words(java大数加法+dp)
- 高精度 大数加法 乘法 除法 模板
- UVA_10183||POJ_2413||ZOJ_1962||HDU_1316(大数加法、检索)
- 杭电ACM 1753 大明A+B(大数:正小数加法)
- HDU-1002-大数加法
- hdu-1715 (大数加法模板)
- C++大数运算之加法,减法
- ACM~大数加法&&hdu题目样例
- 大数加法的字符串实现
- 6.15奇特大数加法
- UVA 10590(完全背包,整数拆分+大数加法)
- HDU 1002 大数加法
- 大数加法.重载实现
- 51Nod1005 大数加法(C语言)
- 大数的加法计算
- 高精度--大数加法 luogu 1601