Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1
这道题有点小麻烦,交了好几次wa 很多小陷阱 注意考虑全面啊。。。。
View Code
#include<stdio.h> #include<string.h> int main() { int a[420], b[420], c[900]; int len1, len2, x, y, i, j, k, x1, y1, flag; char str1[420], str2[420],u,v; while(scanf("%s%c%s%c",str1,&u,str2,&v) != EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); len1 = strlen(str1); len2 = strlen(str2); flag=0;//flag的作用通过x = len1;y = len2;实现 for(i = 0; i < len1; i++) { if(str1[i] >= '0' && str1[i] <= '9') a[i]=str1[i] - '0'; else { x = i; flag = 1; } } if(flag == 0) { x = len1; } flag = 0; for(i = 0; i < len2; i++) { if(str2[i] >= '0' && str2[i] <= '9') b[i] = str2[i]-'0'; else { y = i; flag = 1; } } //寻找小数点位置并转化字符串 if(flag == 0) { y = len2; } if(len1-x > len2-y) { x1 = len1 - 1; y1 = y + len1 - x - 1; j = 450 + len1 - x - 1; } else { x1 = x + len2 - y - 1; y1 = len2 - 1; j = 450 + len2 - y - 1; } if(j < 450) j = 450;//j必须大于450,否则其小数部分为0; k = j; for(;x1 > x; x1--,y1--) { c[k] += a[x1] + b[y1]; if(c[k] > 9) { if(k==451) c[k-2]++;//小数位向整数位进一位时 else c[k-1]++; c[k] -= 10; } k--; } //先处理小数部分 k=449; for(x1 = x-1, y1 = y-1; x1 >= 0||y1 >= 0; x1--,y1--) { c[k] += a[x1] + b[y1]; if(c[k] > 9) { c[k-1]++; c[k] -= 10; } k--; } //后处理整数部分 for(i = 0; i <= 449; i++) { if(c[i] != 0) break; } if(i == 450) printf("0");//整数为0时 else for(; i <= 449; i++) printf("%d",c[i]); for(k = j; k >= 451; k--) if(c[k] != 0) break; if(k == 450) printf("\n");//小数为0时,无小数点 else { printf("."); for(i = 451; i <= k; i++) printf("%d",c[i]);//输出小数 printf("\n"); } } return 0; }