大明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的值。
现在,给你两个正的小数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 }