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

时间:2022-05-05
本文章向大家介绍HDUOJ-------1753大明A+B(大数之小数加法),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

代码:

 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 }