WA了几次,考虑不是很周全啊。。。。
// [4/7/2014 Sjm]/* 推荐测试用例: 1 99999 注意: 1) 小数点左面部分 倒序 存储进数组 2) 小数点右边部分 正序 存储进数组 */
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cstring> #include <algorithm> using namespace std; const int MAX = 405; int myInit_lef(string str, int myStart, int myArr[]) { int pos = 0; for (; myStart >= 0; myStart--){ myArr[pos++] = str[myStart] - '0'; } return pos; } int myInit_rig(string str, int myStart, int myArr[]) { int pos = 0; for (int i = myStart; i < str.size(); i++) { myArr[pos++] = str[i] - '0'; } return pos; } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); string str1, str2; while (cin >> str1 >> str2) { int myLef_1[MAX], myLef_2[MAX], myRig_1[MAX], myRig_2[MAX]; memset(myLef_1, 0, sizeof(myLef_1)); memset(myLef_2, 0, sizeof(myLef_2)); memset(myRig_1, 0, sizeof(myRig_1)); memset(myRig_2, 0, sizeof(myRig_2)); int pos1 = 0, pos2 = 0; // 设初值为 0,不可能出现 '.' 在 0 位置 // 寻找 '.' 位置 for (int i = 0; i < str1.size(); i++) { if ('.' == str1[i]) pos1 = i; } for (int i = 0; i < str2.size(); i++) { if ('.' == str2[i]) pos2 = i; } // 若出现 pos1 或 pos2 == 0, 此时并非小数,可视为整数 if (pos1 == 0) pos1 = str1.size(); if (pos2 == 0) pos2 = str2.size(); int lef_1_len, lef_2_len, rig_1_len, rig_2_len; // 小数点左面部分 倒序 存储进数组,eg: 123.456 存储: 321 // 小数点右边部分 正序 存储进数组,eg: 0.123 存储: 123 lef_1_len = myInit_lef(str1, pos1 - 1, myLef_1); rig_1_len = myInit_rig(str1, pos1 + 1, myRig_1); lef_2_len = myInit_lef(str2, pos2 - 1, myLef_2); rig_2_len = myInit_rig(str2, pos2 + 1, myRig_2); int temp = 0, myLef, myRig; myLef = max(lef_1_len, lef_2_len); myRig = max(rig_1_len, rig_2_len); string str = ""; for (int i = myRig - 1; i >= 0; i--) { // 小数点右边部分从数组最后一位开始计算 (因为正序存储) temp = myRig_1[i] + myRig_2[i] + temp; str = char('0' + (temp % 10)) + str; temp = temp / 10; } str = '.' + str; for (int i = 0; i < myLef; i++) { // 小数点左面部分从数组第一位开始计算 (因为倒序存储) temp = myLef_1[i] + myLef_2[i] + temp; str = char('0' + temp % 10) + str; temp = temp / 10; } if (temp) str = char('0' + temp) + str; // 判断是否需要进位 int myend = str.size() - 1; while (str[myend] == '0' || str[myend] == '.') { // 若含 '.' 且计算结果最后含 0,则进行去零操作 if (str[myend] == '.') { myend--; break; } myend--; } for (int i = 0; i <= myend; i++) printf("%c", str[i]); printf("\n"); } return 0; }