问题:大明A+B
https://vjudge.net/problem/HDU-1753
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input 本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。 Output 请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1Sample Output
4 3.4555434454 2.1
题意分析:
将整数部分和小数部分分别存入到两个数组中,从小数部分开始相加,如果大于10进1就行了。
AC代码:
# include <stdio.h> # include <string.h> char a[500], b[500]; int c[500], d[500], e[500], g[500], sum[500], sum1[500]; int main (void) { while (~scanf("%s %s", a, b)) { memset(c, 0, 500); memset(d, 0, 500); memset(e, 0, 500); memset(g, 0, 500); memset(sum, 0, 500); memset(sum1, 0, 500); int a0 = strlen(a), b0 = strlen(b), ca = 0, cb = 0, i, j, m, k = 0, k1 = 0; for (i = 0; a[i] != '\0'; i ++) { if (a[i] == '.') { ca = 1; break; } } m = 0; for (j = i-1; j >= 0; j --) { c[m ++] = a[j] -'0'; } m = 0; for(j = i+1; j < a0; j ++) { d[m ++] = a[j] - '0'; } for (i = 0; b[i] != '\0'; i ++) { if (b[i] == '.') { ca = 1; break; } } m = 0; for (j = i-1; j >= 0; j --) { e[m ++] = b[j] -'0'; } m = 0; for(j = i+1; j < b0; j ++) { g[m ++] = b[j] - '0'; } m = 0; for (i = 499; i >= 0; i --) { sum[i] += d[i] + g[i]; if (i == 0 && sum[i] >= 10) { sum[i] -= 10; sum1[0] ++; } if (i != 0 && sum[i] >= 10) { sum[i] -= 10; sum[i-1] ++; } } for (i = 0; i <= 499; i ++) { sum1[i] += c[i] + e[i]; if (sum1[i] >= 10) { sum1[i] -= 10; sum1[i+1] ++; } } for (i = 499; i >= 0; i --) { if (sum1[i] != 0) { break; } } if (i == -1) k1 = 1; if (k1 == 1) { printf("0"); for (i = 499; i >= 0; i --) { if (sum[i] != 0) break; } if (i >= 0) printf("."); for (j = 0; j <= i; j ++) { printf("%d", sum[j]); } printf("\n"); } else { for (j = i; j >= 0; j --) printf("%d", sum1[j]); for (i = 499; i >= 0; i --) { if (sum[i] != 0) break; } if(i >= 0) printf("."); for (j = 0; j <= i; j ++) { printf("%d", sum[j]); } printf("\n"); } } return 0; }