前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDUOJ-------1753大明A+B(大数之小数加法)

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

作者头像
Gxjun
发布2018-03-22 12:59:39
6970
发布2018-03-22 12:59:39
举报
文章被收录于专栏:ml

大明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

2007省赛集训队练习赛(6)_linle专场

代码:

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-04-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大明A+B
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档