1.链接地址:
http://bailian.openjudge.cn/practice/2738
2.题目:
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0- 输入
- 第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
- 输出
- n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
- 样例输入
2
0.111111111111111111111111111111
0.111111111111111111111111111111 10000000.655555555555555555555555555555
1.444444444444444444444444444445- 样例输出
0.222222222222222222222222222222
10000002.1
3.思路:
利用大整数加法的基础
首先做预处理,去除小数点,小数较短的数补零
计算后做后处理,首先判断是否有进位,有则拓展一位,去除小数后面的零,添加点
4.代码:
#include <iostream>
#include <cstdio>
#include <string> using namespace std; string sum(string s1,string s2)
{
if(s1.length()<s2.length())
{
string temp=s1;
s1=s2;
s2=temp;
}
int i,j;
for(i=s1.length()-,j=s2.length()-;i>=;i--,j--)
{
s1[i]=char(s1[i]+(j>=?s2[j]-'':)); //注意细节
if(s1[i]-''>=)
{
s1[i]=char((s1[i]-'')%+'');
if(i) s1[i-]++;
else s1=''+s1;
}
}
return s1;
} string real_sum(string s1,string s2)
{
string::size_type idx_s1_point = s1.find(".");
s1.erase(idx_s1_point,); string::size_type idx_s2_point = s2.find(".");
s2.erase(idx_s2_point,); string::size_type int_res_len = idx_s1_point>idx_s2_point?idx_s1_point:idx_s2_point; string::size_type dec_s1_len = s1.size() - idx_s1_point;
string::size_type dec_s2_len = s2.size() - idx_s2_point; string::size_type dec_res_len;
if(dec_s1_len < dec_s2_len)
{
s1 += string(dec_s2_len - dec_s1_len, '');
dec_res_len = dec_s2_len;
}
else
{
s2 += string(dec_s1_len - dec_s2_len, '');
dec_res_len = dec_s1_len;
} string res = sum(s1,s2); if(res.size() > int_res_len + dec_res_len)
{
++int_res_len;
} string::size_type idx_res_tail = res.find_last_not_of(""); res = res.substr(,idx_res_tail + );
res.insert(int_res_len,"."); return res;
} int main()
{ int n;
cin>>n; string s1,s2;
while(n--)
{
cin>>s1>>s2;
cout<<real_sum(s1,s2)<<endl;
} return ;
}