題目 [html] view plaincopy 題目描述: 求2個浮點數相加的和 題目中輸入輸出中出現浮點數都有如下的形式: P1P2...Pi.Q1Q2...Qj 對於整數部分,P1P2...Pi是一個非負整數 對於小數部分,Qj不等於0 輸入: 對於每組案例,第1行是測試數據的組數n,每組測試數據占2行,分別是兩個加數。 每組測試數據之間有一個空行,每行數據不超過100個字符 輸出: 每組案例是n行,每組測試數據有一行輸出是相應的和。 輸出保證一定是一個小數部分不為0的浮點數 樣例輸入: 2 0.111111111111111111111111111111 0.111111111111111111111111111111 10000000.655555555555555555555555555555 1.444444444444444444444444444445 樣例輸出: 0.222222222222222222222222222222 10000002.1 思路 這道題本來考察的應該是大整數加法,但是太多細節需要注意了,我提示幾點: 細心,分解整數部分和小數部分,分別相加,注意大整數加法的進位 注意一個測試用例,0.0+0.0應該=0.0 注意對整數部分開始0的截斷,和小數部分最後0的截斷 AC代碼 [cpp] #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 101 int ia[LEN], fa[LEN], ib[LEN], fb[LEN], ic[LEN], fc[LEN]; int main() { char str1[LEN], str2[LEN]; int i, j, k, n, l1, l2, lai, laf, lbi, lbf, temp, flmax, ilmax; while (scanf("%d", &n) != EOF) { while (n --) { // 初始化 memset(ia, 0, sizeof(ia)); memset(fa, 0, sizeof(fa)); memset(ib, 0, sizeof(ib)); memset(fb, 0, sizeof(fb)); memset(ic, 0, sizeof(ic)); memset(fc, 0, sizeof(fc)); // 接收第一個浮點數 scanf("%s", str1); l1 = strlen(str1); // 構建整數部分數組 for (i = 0; i < l1 && str1[i] != '.'; i ++) { ia[i] = str1[i] - '0'; } lai = i; // 數位替換 for (j = 0, k = lai - 1; j <= lai / 2 && j < k; j ++, k --) { temp = ia[j]; ia[j] = ia[k]; ia[k] = temp; } // 構建小數部分數組 for (i += 1; i < l1; i ++) { fa[i - 1 - lai] = str1[i] - '0'; } laf = i - 1 - lai; // 接收第二個浮點數 scanf("%s", str2); l2 = strlen(str2); // 構建整數部分數組 for (i = 0; i < l2 && str2[i] != '.'; i ++) { ib[i] = str2[i] - '0'; } lbi = i; // 數位替換 for (j = 0, k = lbi - 1; j <= lbi / 2 && j < k; j ++, k --) { temp = ib[j]; ib[j] = ib[k]; ib[k] = temp; } // 構建小數部分數組 for (i += 1; i < l2; i ++) { fb[i - 1 - lbi] = str2[i] - '0'; } lbf = i - 1 - lbi; // 誰的小數位數更多 flmax = (laf >= lbf) ? laf : lbf; int c = 0; //小數進位 for (i = 0, j = flmax - 1; j >= 0; j --, i ++) { fc[i] = fa[j] + fb[j] + c; if (fc[i] >= 10) { c = fc[i] / 10; fc[i] %= 10; }else { c = 0; } } // 整數相加 ilmax = (lai >= lbi) ? lai : lbi; for (i = 0; i < ilmax; i ++) { ic[i] = ia[i] + ib[i] + c; if (ic[i] >= 10) { c = ic[i] / 10; ic[i] %= 10; }else { c = 0; } } while (c) { ic[ilmax ++] = c % 10; c /= 10; } // 打印最後結果 // 找到第一個不為0的整數位 for (j = ilmax - 1; j >= 0; j --) { if (ic[j] != 0) { break; } } if (j >= 0) { for (i = j; i >= 0; i --) { printf("%d", ic[i]); } }else { printf("0"); } printf("."); // 找到最後一個不為0的小數位 for (j = 0; j < flmax - 1; j ++) { if (fc[j] != 0) { break; } } for (i = flmax - 1; i >= j; i --) { printf("%d", fc[i]); } printf("\n"); // 接收空行 getchar(); } } return 0; } /************************************************************** Problem: 1137 User: wangzhengyi Language: C Result: Accepted Time:290 ms Memory:912 kb ****************************************************************/