大明A+B
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的值。
这时他已经不是那个只会做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
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(" "); 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 }