1 题目描述
2 求2个浮点数相加的和
3
4 题目中输入输出中出现浮点数都有如下的形式:
5 P1P2
Pi.Q1Q2
Qj
6 对于整数部分,P1P2
Pi是一个非负整数
7 对于小数部分,Qj不等于0
8
9 输入
10 第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
11
12 输出
13 n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
14
15 样例输入
16 2
17 0.111111111111111111111111111111
18 0.111111111111111111111111111111
19
20 10000000.655555555555555555555555555555
21 1.444444444444444444444444444445
22
23 样例输出
24 0.222222222222222222222222222222
25 10000002.1
算法思路:
还是用字符串保存大数。
1. 去掉字符串中间的点号,对点号后面的小数位数补齐(这样就可以方便的按正常算法来从低位到高位计算了)。
2. 记录小数点的位置。加完以后,再把小数点添回去。
想的还是太多太乱了。还是要多练,练更多的题。跨专业真蛋疼。。。
1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 const int MAX=110;
5 char a[MAX], b[MAX], c[MAX];
6
7 void add(char a[],char b[], char back[])
8 {
9 int i,j,k,carry,x,y,z,l;
10 if(strlen(a) > strlen(b))
11 {
12 l = strlen(a)+2;
13 }
14 else
15 l = strlen(b)+2;
16 char *tmp = (char *)malloc(l*sizeof(char));
17 i=strlen(a)-1;
18 j=strlen(b)-1;
19 k=0;
20 carry = 0;
21 while( i>=0 || j>=0 )
22 {
23 if(i<0)
24 {
25 x=0;
26 }
27 else
28 {
29 x=a[i]-'0';
30 }
31 if(j<0)
32 {
33 y=0;
34 }
35 else
36 {
37 y=b[j]-'0';
38 }
39 z=x+y+carry;
40 if(z>9)
41 {
42 z%=10;
43 carry = 1;
44 }
45 else
46 carry = 0;
47 tmp[k++] = z+'0';
48 --i;
49 --j;
50 }
51 if(carry)
52 {
53 tmp[k++] = '1';
54 }
55 tmp[k] = 0;
56 for(k-=1,i=0; k>=0; --k)
57 back[i++] = tmp[k];
58 back[i] = 0;
59 }
60
61 int dec(char a[], char b[])
62 {
63 int i,j,k,L1,L2;
64 L1=strlen(a);
65 L2=strlen(b);
66 for(i=0; i<L1; ++i)
67 {
68 if(a[i] == '.')
69 {
70 for(k=i; k<L1; ++k)
71 a[k]=a[k+1];
72 --L1;
73 break;
74 }
75 }
76 for(j=0; j<L2; ++j)
77 {
78 if(b[j]=='.')
79 {
80 for(k=j; k<L2; ++k)
81 b[k]=b[k+1];
82 --L2;
83 break;
84 }
85 }
86 k=(L1-i)-(L2-j);
87 if(i==L1 && j==L2)
88 return 0;
89 else if(k>0)
90 {
91 while(k!=0)
92 {
93 b[L2++]='0';
94 --k;
95 }
96 return L1-i;
97 }
98 else
99 {
100 k*=-1;
101 while(k!=0)
102 {
103 a[L1++]='0';
104 --k;
105 }
106 return L2-j;
107 }
108 }
109
110 void result(char c[], int n)
111 {
112 int i,length;
113 length=strlen(c);
114 for(i=length;i>length-n; --i)
115 {
116 c[i] = c[i-1];
117 }
118 c[i]='.';
119 for(i=length; i>=length-n; --i)
120 {
121 if(c[i]!='0' && i!=length-n)
122 {
123 break;
124 }
125 else
126 {
127 c[i]=0;
128 }
129 }
130 }
131
132 int main()
133 {
134 int n,k;
135 scanf("%d", &n);
136 while(n--)
137 {
138 memset(a,0,sizeof(a));
139 memset(b,0,sizeof(b));
140 memset(c,0,sizeof(c));
141 scanf("%s%s",a,b);
142 k=dec(a,b);
143 add(a,b,c);
144 result(c,k);
145 printf("%s\n", c);
146 }
147 return 0;
148 }
149