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 }