题目描述:
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入:
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。 每组测试数据之间有一个空行,每行数据不超过100个字符
输出:
每组案例是n行,每组测试数据有一行输出是相应的和。 输出保证一定是一个小数部分不为0的浮点数
样例输入:
2
3.756
90.564
4543.5435
43.25
样例输出:
94.32
4586.7935
实现代码:
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std
;
struct bign
{
int d1
[100];
int len1
;
int d2
[100];
int len2
;
bign(){
memset(d1
,0,sizeof(d1
));
len1
=0;
memset(d2
,0,sizeof(d2
));
len2
=0;
}
};
bign
change(char str
[]){
bign a
;
int len
=strlen(str
);
int i
;
for(i
=0;i
<len
&&str
[len
-1-i
]!='.';i
++){
a
.d2
[i
]=str
[len
-1-i
]-'0';
}
a
.len2
=i
;
for(int k
=0;k
<a
.len2
/2;k
++){
int temp
=a
.d2
[k
];
a
.d2
[k
]=a
.d2
[a
.len2
-k
-1];
a
.d2
[a
.len2
-k
-1]=temp
;
}
a
.len1
=len
-i
-1;
int j
=0;
for(i
=i
+1;i
<len
;i
++){
a
.d1
[j
++]=str
[len
-i
-1]-'0';
}
return a
;
}
bign
add(bign a
,bign b
){
bign c
;
int carry
=0;
for(int i
=a
.len2
-1>b
.len2
-1?a
.len2
-1:b
.len2
-1;i
>=0;i
--){
int temp
=a
.d2
[i
]+b
.d2
[i
]+carry
;
c
.d2
[c
.len2
++]=temp
%10;
carry
=temp
/10;
}
for(int k
=0;k
<c
.len2
/2;k
++){
int temp
=c
.d2
[k
];
c
.d2
[k
]=c
.d2
[c
.len2
-k
-1];
c
.d2
[c
.len2
-k
-1]=temp
;
}
while(c
.len2
-1>0&&c
.d2
[c
.len2
-1]==0){
c
.len2
--;
}
for(int i
=0;i
<a
.len1
||i
<b
.len1
;i
++){
int temp
=a
.d1
[i
]+b
.d1
[i
]+carry
;
c
.d1
[c
.len1
++]=temp
%10;
carry
=temp
/10;
}
if(carry
!=0){
c
.d1
[c
.len1
++]=carry
;
}
return c
;
}
void print(bign a
){
for(int i
=a
.len1
-1;i
>=0;i
--){
printf("%d",a
.d1
[i
]);
}
printf(".");
for(int i
=0;i
<a
.len2
;i
++){
printf("%d",a
.d2
[i
]);
}
}
int main(){
char str1
[110];
char str2
[110];
int n
;
while(scanf("%d",&n
)!=EOF){
for(int i
=0;i
<n
;i
++){
scanf("%s",&str1
);
scanf("%s",&str2
);
bign a
=change(str1
);
bign b
=change(str2
);
print(add(a
,b
));
printf("\n");
}
}
return 0;
}