1. 程式人生 > 其它 >HDUOJ-------1753大明A+B(大數之小數加法)

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 }