题目描述:
求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;
}
// 去掉小数点后多余的0
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;
}