求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
时间限制:1000
内存限制:65536
输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222
#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; }