OpenJudge 2738 浮点数加法

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 }
原文地址:https://www.cnblogs.com/mobileliker/p/3544693.html