问题描述:
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2…Pi.Q1Q2…Qj
对于整数部分,P1P2…Pi是一个非负整数
对于小数部分,Qj不等于0
输入要求:
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
#include<bits/stdc++.h>
using namespace std;
struct bign{
int c[105],d[105];
int len1,len2;
bign(){
fill(d,d+105,0);
fill(c,c+105,0);
int len1=0;
int len2=0;
}
};
bign change(char str[]){
bign a;
a.c[0]=0;
a.len1=0;
a.len2=0;
int len=0;
for(int i=0;i<strlen(str);i++){
if(str[i]=='.'){
len=i;
break;
}
}
for(int i=0;i<strlen(str);i++){
if(i<len){
a.c[len-1-i]=str[i]-'0';
}
else{
a.d[i-len-1]=str[i]-'0';
}
}
a.len1=len;
a.len2=strlen(str)-len-1;
return a;
}
bign add(bign a,bign b){ //高精度加
bign c;
c.len1=0;
c.len2=max(a.len2,b.len2);
c.c[0]=0;
int carry1=0,carry2=0;//carry是进位
for(int i=max(a.len2,b.len2)-1;i>=0;i--){
int temp2=a.d[i]+b.d[i]+carry2;
c.d[i]=temp2%10;
carry2=temp2/10;
}
for(int i=0;i<a.len1||i<b.len1;i++){
int temp1=a.c[i]+b.c[i]+carry1+carry2;
c.c[c.len1++]=temp1%10;
carry1=temp1/10;
carry2=0;
}
for(int i=max(a.len2,b.len2)-1;i>=1;i--){
if(c.d[i]==0){
c.len2--;
}
else{
break;
}
}
if(carry1!=0){
c.d[c.len1++]=carry1;
}
return c;
}
void print(bign a){ //输出bign
for(int i=a.len1-1;i>=0;i--){
printf("%d",a.c[i]);
}
printf(".");
for(int i=0;i<a.len2;i++){
printf("%d",a.d[i]);
}
printf("\n");
}
int main(){
int n;
char str1[105],str2[105];
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
scanf("%s",str1);
scanf("%s",str2);
bign a=change(str1);
bign b=change(str2);
//print(a);
//print(b);
print(add(a,b));
}
}
return 0;
}