Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7545 Accepted Submission(s): 2662
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
Author
linle
Source
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #define maxn 405
5 char sa[maxn],sb[maxn];
6 struct node
7 {
8 int NN[405],point[405];
9 int pos,nlen;
10 void init()
11 {
12 memset(NN,0,sizeof(NN));
13 memset(point,0,sizeof(point));
14 }
15 };
16 node aa,bb;
17 void cal(char *str,node *p) //将大小数分解
18 {
19 int i,k,j=0,temp;
20 p->pos=strlen(str)-1;
21 for(i=0;str[i]!='.'&&i<=p->pos;i++)
22 p->NN[j++]=str[i]-'0';
23 for(k=i-1,j=0;k>j;k--,j++){
24 temp=p->NN[k];
25 p->NN[k]=p->NN[j];
26 p->NN[j]=temp;
27 }
28 if(i<=p->pos) p->nlen=i++; //NN长度点位置
29 else p->nlen=p->pos;
30 p->pos-=p->nlen ; //小数位数
31 for(j=0;i<strlen(str);i++)
32 p->point[j++]=str[i]-'0'; //不进行逆序
33 }
34 void work(node sa ,node sb){
35 int i,j,cc,maxc,minc,p_len=0;
36 if(sa.pos>sb.pos){
37 minc=sb.pos;
38 maxc=sa.pos;
39 }
40 else{
41 minc=sa.pos;
42 maxc=sb.pos;
43 }
44 cc=0;
45 p_len=maxc-1;
46 for(i=maxc-1;i>=0;i--){
47 sa.point[i]+=sb.point[i]+cc;
48 cc= sa.point[i]/10;
49 sa.point[i]%=10;
50 }
51 if(sa.nlen>sb.nlen){
52 maxc=sa.nlen;
53 minc=sb.nlen;
54 }
55 else{
56 maxc=sb.nlen;
57 minc=sa.nlen;
58 }
59 //判断小数点是否进
60 maxc++;
61 for(i=0,j=0;j<=maxc;j++){
62 sa.NN[j]+=sb.NN[i++]+cc ;
63 cc=sa.NN[j]/10 ;
64 sa.NN[j]%=10 ;
65 }
66 while(maxc>0&&sa.NN[maxc]==0) maxc--;
67 while(maxc>=0)
68 printf("%d",sa.NN[maxc--]);
69 i=0;
70 while(sa.point[p_len]==0) p_len--;
71 if(i<=p_len) printf(".");
72 for(j=i;j<=p_len;j++)
73 printf("%d",sa.point[j]);
74 printf("\n");
75 }
76 int main()
77 {
78 while(scanf("%s%s",sa,sb)!=EOF)
79 {
80 aa.init();
81 bb.init();
82 cal(sa,&aa);
83 cal(sb,&bb);
84 work(aa,bb);
85 }
86 return 0;
87 }