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.代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 5 using namespace std; 6 7 string sum(string s1,string s2) 8 { 9 if(s1.length()<s2.length()) 10 { 11 string temp=s1; 12 s1=s2; 13 s2=temp; 14 } 15 int i,j; 16 for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) 17 { 18 s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0)); //注意细节 19 if(s1[i]-'0'>=10) 20 { 21 s1[i]=char((s1[i]-'0')%10+'0'); 22 if(i) s1[i-1]++; 23 else s1='1'+s1; 24 } 25 } 26 return s1; 27 } 28 29 string real_sum(string s1,string s2) 30 { 31 string::size_type idx_s1_point = s1.find("."); 32 s1.erase(idx_s1_point,1); 33 34 string::size_type idx_s2_point = s2.find("."); 35 s2.erase(idx_s2_point,1); 36 37 string::size_type int_res_len = idx_s1_point>idx_s2_point?idx_s1_point:idx_s2_point; 38 39 string::size_type dec_s1_len = s1.size() - idx_s1_point; 40 string::size_type dec_s2_len = s2.size() - idx_s2_point; 41 42 43 44 string::size_type dec_res_len; 45 if(dec_s1_len < dec_s2_len) 46 { 47 s1 += string(dec_s2_len - dec_s1_len, '0'); 48 dec_res_len = dec_s2_len; 49 } 50 else 51 { 52 s2 += string(dec_s1_len - dec_s2_len, '0'); 53 dec_res_len = dec_s1_len; 54 } 55 56 string res = sum(s1,s2); 57 58 if(res.size() > int_res_len + dec_res_len) 59 { 60 ++int_res_len; 61 } 62 63 string::size_type idx_res_tail = res.find_last_not_of("0"); 64 65 res = res.substr(0,idx_res_tail + 1); 66 res.insert(int_res_len,"."); 67 68 return res; 69 } 70 71 int main() 72 { 73 74 int n; 75 cin>>n; 76 77 string s1,s2; 78 while(n--) 79 { 80 cin>>s1>>s2; 81 cout<<real_sum(s1,s2)<<endl; 82 } 83 84 85 return 0; 86 }