Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11929 Accepted Submission(s): 4336
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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.1
Sample Output
4
3.4555434454
2.1
思路:把400位的数据扩大成800位,前400位(0-399)储存整数,后400位(400-799)存储小数,然后就可以按整数
加法来算了,输出的时候控制一下就行了,该输出小数点的的地方(在399-400之间)数输出小数点。
#include <stdio.h>#include <string.h>const int M=800;int a[M];int b[M];int c[M];int main(){ char x[M/2],y[M/2]; int len1,len2; int i,j; while(~scanf("%s%s",x,y)) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); char *dot1=NULL,*dot2=NULL; len1 = strlen(x); len2 = strlen(y); dot1 = strchr(x,'.'); dot2 = strchr(y,'.'); if(dot1 == NULL ) { for(i=399,j=len1-1; j>=0; j--,i--) { a[i] = x[j]-48; } } else { int t = dot1-x; for(i=399,j=t-1; j>=0; i--,j--) { a[i] = x[j]-48; } for(i=400,j=t+1; j<len1; i++,j++) { a[i] = x[j]-48; } }// printf("a=");// for(i=0; i<M; i++)// {// printf("%d",a[i]);// }// printf("\n"); if(dot2 == NULL ) { for(i=399,j=len2-1; j>=0; j--,i--) { b[i] = y[j]-48; } } else { int t = dot2-y; for(i=399,j=t-1; j>=0; i--,j--) { b[i] = y[j]-48; } for(i=400,j=t+1; j<len2; i++,j++) { b[i] = y[j]-48; } }// printf("b=");// for(i=0; i<M; i++)// {// printf("%d",b[i]);// }// printf("\n"); int sum=0,carry=0; for(i=M-1; i>=0; i--) { sum = a[i]+b[i]+carry; c[i] = sum; carry = sum/10; } int left=400,right=399;//这个地方画蛇添足了,可以直接初始化为零。 for(i=0; i<400; i++) { if(c[i]) { left = i; break; } } for(i=M-1; i>=400; i--) { if(c[i]) { right = i; break; } } // printf("left=%d,right = %d\n",left,right); if(left == 400)//如果是.132 这样的数据就要在前面加零。 { printf("0"); } for(i=left;i<=right;i++) { if(i==400) { printf("."); } printf("%d",c[i]); } printf("\n"); } return 0;}
转载请注明原文地址: https://ju.6miu.com/read-672611.html