HDU1753: 大明A+B

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5533    Accepted Submission(s): 1870

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
 
  1 /*
  2 带小数点的大数加法
  3 思路清晰简单,几分钟就想清楚
  4 但敲代码1个多小时,改错又是1个半小时 汗……
  5 要提高敲键盘的速度以及正确率啊,还有就是敲之前一定要想清楚
  6 */
  7 
  8 #include <iostream>
  9 #include <string.h>
 10 #include <stdio.h>
 11 #include <math.h>
 12 using namespace std;
 13 const int MAX=1000;
 14 char que[3][MAX];  //存入初始字符串
 15 int data[3][MAX];  //存入字符串转换过来的数据
 16 int answer[MAX];  //最后的答案
 17 int main()
 18 {
 19     int len[3];  //两字符串长度
 20     int dian[3]; //字符串转换成实数后小数点的位置
 21     while(scanf("%s%s",que[1],que[2])!=EOF)
 22     {
 23         memset(data,0,sizeof(data));
 24         memset(answer,0,sizeof(answer));
 25         len[1]=strlen(que[1])-1;
 26         len[2]=strlen(que[2])-1;
 27         //printf("len    %d  %d\n",len[1],len[2]);
 28          //printf("%s    %s\n",que[1],que[2]);
 29         dian[1]=-1;
 30         dian[2]=-1;
 31 
 32         //for循环将字符串转换成实数,并找出小数点的位置
 33         for(int i=1;i<3;i++)
 34             for(int j=len[i];j>=0;j--)
 35             {
 36                 if(que[i][j]=='.')
 37                    dian[i]=len[i]-j;
 38                 else
 39                    data[i][len[i]-j]=que[i][j]-'0';
 40             }
 41         /*
 42         检验数据的转换是否完成以及小数点的位置
 43         for(int i=0;i<=len[1];i++)
 44           printf("%d   ",data[1][i]);
 45           printf("\n");
 46         for(int i=0;i<=len[2];i++)
 47           printf("%d   ",data[2][i]);
 48           printf("\n");
 49         printf("%d   %d\n",dian[1],dian[2]);
 50         */
 51 
 52         //将两个实数的小数点对齐
 53         int sub;
 54         if(dian[1]>dian[2])
 55         {
 56             sub=dian[1]-dian[2];
 57             for(int j=len[2]+sub;j>=0;j--)
 58             {
 59                 if(j>=sub)
 60                     data[2][j]=data[2][j-sub];
 61                 else
 62                     data[2][j]=0;
 63                 dian[2]=dian[1];
 64             }
 65         }
 66         if(dian[2]>dian[1])
 67         {
 68             sub=dian[2]-dian[1];
 69             for(int j=len[1]+sub;j>=0;j--)
 70             {
 71                 if(j>=sub)
 72                     data[1][j]=data[1][j-sub];
 73                 else
 74                     data[1][j]=0;
 75                 dian[1]=dian[2];
 76             }
 77         }
 78 
 79         /*
 80         //小数点转换完成后的实数数据以及小数点的位置
 81         for(int i=0;i<=len[1]+sub;i++)
 82           printf("%d  ",data[1][i]);
 83           printf("\n");
 84         for(int i=0;i<=len[2]+sub;i++)
 85           printf("%d  ",data[2][i]);
 86           printf("\n");
 87         printf("dian   %d  %d\n",dian[1],dian[2]);
 88         */
 89         for(int i=0;i<2+len[1]+len[2];i++)
 90         {
 91             answer[i]=data[1][i]+data[2][i];
 92             //printf("%d  ",answer[i]);//两数相加但是并不进位
 93         }
 94         //printf("\n");
 95 
 96         //进位处理,注意小数点在进位时的影响
 97         for(int i=0;i<2+len[1]+len[2];i++)
 98         {
 99             if(i+1==dian[1])
100             {
101                 answer[i+2]+=answer[i]/10;//跳过小数点位置进位
102                 answer[i]=answer[i]%10;
103                 i++;
104             }
105             else
106             {
107                 answer[i+1]+=answer[i]/10;
108                 answer[i]=answer[i]%10;
109             }
110         }
111         //令小数点位置处为零,防止寻找s时造成影响
112         if(dian[1]>=0)
113           answer[dian[1]]=0;
114          int s,t;
115          //寻找数据输出的最低位
116         for(s=0;s<=dian[1];s++)
117             if(answer[s]!=0)
118                break;
119          //寻找数据输出的最高位
120         for(t=len[1]+len[2]+2;t>dian[1];t--)
121             if(answer[t]!=0)
122                 break;
123         //printf("s=%d  t=%d\n",s,t);
124         //若相加两数均为整数,则个位为最低位,输出时无小数点
125         if(dian[1]==-1)
126           s=0;
127 
128         for(int i=t;i>=s;i--)
129         {
130             if(i==dian[1])
131               printf(".");
132             else
133               printf("%d",answer[i]);
134         }
135 
136         printf("\n");
137 
138     }
139     //cout << "Hello world!" << endl;
140     return 0;
141 }

 

 

 

 

posted on 2013-01-14 18:05  行者1992  阅读(167)  评论(0编辑  收藏  举报