首页 > 其他 > 详细

HDUOJ-------1753大明A+B(大数之小数加法)

时间:2014-04-26 14:44:12      阅读:626      评论:0      收藏:0      [点我收藏+]

大明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的值。
 

 

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
 
 
代码:
bubuko.com,布布扣
 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 }
View Code

 

 

HDUOJ-------1753大明A+B(大数之小数加法),布布扣,bubuko.com

HDUOJ-------1753大明A+B(大数之小数加法)

原文:http://www.cnblogs.com/gongxijun/p/3690743.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!