OpenJudge 2738 浮點數加法

1.連接地址:ios

http://bailian.openjudge.cn/practice/2738測試

2.題目:spa

總時間限制:
1000ms
內存限制:
65536kB
描述
求2個浮點數相加的和

題目中輸入輸出中出現浮點數都有以下的形式:
P 1P 2...P i.Q 1Q 2...Q j
對於整數部分,P 1P 2...P i是一個非負整數
對於小數部分,Q j不等於0
輸入
第1行是測試數據的組數n,每組測試數據佔2行,分別是兩個加數。每組測試數據之間有一個空行,每行數據不超過100個字符
輸出
n行,每組測試數據有一行輸出是相應的和。輸出保證必定是一個小數部分不爲0的浮點數
樣例輸入
2
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445
樣例輸出
0.222222222222222222222222222222
10000002.1

3.思路:code

利用大整數加法的基礎blog

首先作預處理,去除小數點,小數較短的數補零內存

計算後作後處理,首先判斷是否有進位,有則拓展一位,去除小數後面的零,添加點ci

4.代碼:get

 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 }
相關文章
相關標籤/搜索