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 }