BigNums 之 hdu 1753

WA了几次,考虑不是很周全啊。。。。

 

//  [4/7/2014 Sjm]
/*
推荐测试用例:
1 99999
注意:
1) 小数点左面部分 倒序 存储进数组
2) 小数点右边部分 正序 存储进数组
*/
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <cstring>
 7 #include <algorithm>
 8 using namespace std;
 9 const int MAX = 405;
10 
11 int myInit_lef(string str, int myStart, int myArr[])
12 {
13     int pos = 0;
14     for (; myStart >= 0; myStart--){
15         myArr[pos++] = str[myStart] - '0';
16     }
17     return pos;
18 }
19 
20 int myInit_rig(string str, int myStart, int myArr[])
21 {
22     int pos = 0;
23     for (int i = myStart; i < str.size(); i++) {
24         myArr[pos++] = str[i] - '0';
25     }
26     return pos;
27 }
28 
29 int main()
30 {
31     //freopen("input.txt", "r", stdin);
32     //freopen("output.txt", "w", stdout);
33     string str1, str2;
34     while (cin >> str1 >> str2)
35     {
36         int myLef_1[MAX], myLef_2[MAX], myRig_1[MAX], myRig_2[MAX];
37         memset(myLef_1, 0, sizeof(myLef_1));
38         memset(myLef_2, 0, sizeof(myLef_2));
39         memset(myRig_1, 0, sizeof(myRig_1));
40         memset(myRig_2, 0, sizeof(myRig_2));
41         int pos1 = 0, pos2 = 0; // 设初值为 0,不可能出现 '.' 在 0 位置
42         // 寻找 '.' 位置
43         for (int i = 0; i < str1.size(); i++) {
44             if ('.' == str1[i])
45                 pos1 = i;
46         }
47         for (int i = 0; i < str2.size(); i++) {
48             if ('.' == str2[i])
49                 pos2 = i;
50         }
51         // 若出现 pos1 或 pos2 == 0, 此时并非小数,可视为整数
52         if (pos1 == 0) pos1 = str1.size();
53         if (pos2 == 0) pos2 = str2.size();
54         int lef_1_len, lef_2_len, rig_1_len, rig_2_len;
55         // 小数点左面部分 倒序 存储进数组,eg: 123.456   存储: 321
56         // 小数点右边部分 正序 存储进数组,eg: 0.123     存储: 123
57         lef_1_len = myInit_lef(str1, pos1 - 1, myLef_1);
58         rig_1_len = myInit_rig(str1, pos1 + 1, myRig_1);
59         lef_2_len = myInit_lef(str2, pos2 - 1, myLef_2);
60         rig_2_len = myInit_rig(str2, pos2 + 1, myRig_2);
61         int temp = 0, myLef, myRig;
62         myLef = max(lef_1_len, lef_2_len);
63         myRig = max(rig_1_len, rig_2_len);
64         string str = "";
65         for (int i = myRig - 1; i >= 0; i--) {  
66             // 小数点右边部分从数组最后一位开始计算 (因为正序存储)
67             temp = myRig_1[i] + myRig_2[i] + temp;
68             str = char('0' + (temp % 10)) + str;
69             temp = temp / 10;
70         }
71         str = '.' + str;
72         for (int i = 0; i < myLef; i++) {
73             // 小数点左面部分从数组第一位开始计算 (因为倒序存储)
74             temp = myLef_1[i] + myLef_2[i] + temp;
75             str = char('0' + temp % 10) + str;
76             temp = temp / 10;
77         }
78         if (temp) str = char('0' + temp) + str; // 判断是否需要进位
79         int myend = str.size() - 1;
80         while (str[myend] == '0' || str[myend] == '.') { 
81             // 若含 '.' 且计算结果最后含 0,则进行去零操作
82             if (str[myend] == '.') { myend--; break; }
83             myend--;
84         }
85         for (int i = 0; i <= myend; i++)
86             printf("%c", str[i]);
87         printf("\n");
88     }
89     return 0;
90 }
posted @ 2014-04-12 19:04  JmingS  阅读(148)  评论(0编辑  收藏  举报