大明A+B
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 44 Accepted Submission(s) : 9
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.91.1111111111 2.34443233431 1.1
Sample Output
43.45554344542.1
Author
Source
2007省赛集训队练习赛(6)_linle专场
思路分析:我们可以把输入的两个数据都是正小数。因此通过找小数点把输入的每一个数据分成整数部分和小数部分,我们再整数部分右对齐,采用倒序相加,小数部分如此
#include<stdio.h>
#include<string.h>#define N 500int main(){ int n,m,i,j,c[N],d[N],e[N],f[N],x[N],y[N],t,k,s,p,q; char a[N],b[N]; while(scanf("%s %s",a,b)!=EOF) { memset(c,0,sizeof(c)); //初始化 memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); memset(f,0,sizeof(f)); t=m=strlen(a); k=n=strlen(b); for(i=0;i<m;i++) //找第一个数据的小数点,将小数点的位置 { if(a[i]=='.') t=i; } for(i=0;i<n;i++) 找第=个数据的小数点,将小数点的位置 { if(b[i]=='.') k=i; } for(i=0,j=t-1;i<t;i++) { c[i]=a[j]-'0';j--;} for(i=0,j=k-1;i<k;i++) { d[i]=b[j]-'0';j--;} for(i=t+1,j=0;i<m;i++) { e[j]=a[i]-'0';j++;} for(i=k+1,j=0;i<n;i++) { f[j]=b[i]-'0';j++;} j=q=0; if((m-t)<(n-k)) j=n-k; else j=m-t; for(i=j-1,p=0;i>=0;i--) { x[i]=(e[i]+f[i]+p)%10; if(e[i]+f[i]+p>9) p=(e[i]+f[i]+p)/10; else p=0; } if(t<k) q=k; else q=t; for(i=0;i<=q;i++) { y[i]=(c[i]+d[i]+p)%10; if(c[i]+d[i]+p>9) p=(c[i]+d[i]+p)/10; else p=0; } if(y[q]>0) //考虑进位 q=q+1; for(i=q-1;i>=0;i--) printf("%d",y[i]); while(x[j-1]==0) //消除0 { if(x[j-1]==0) j=j-1; } if(j>0) printf("."); for(i=0;i<j;i++) printf("%d",x[i]);printf("\n"); } return 0;}