浮点数加法 九度oj
题目
题目描述: 求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代码
#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 ****************************************************************/