-
题目描述:
-
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
-
输入:
-
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
-
输出:
-
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
-
样例输入:
-
2 0.111111111111111111111111111111 0.111111111111111111111111111111 10000000.655555555555555555555555555555 1.444444444444444444444444444445
-
样例输出:
-
0.222222222222222222222222222222 10000002.1
代码:
#include <stdio.h>
#include <string.h>
struct bigFloat {
int digit[110];
int size;
int num;
void init() {
for(int i=0;i<110;i++)
digit[i] = 0;
size = 0;
num = 0;
}
void set(char str[]) {
int len = strlen(str);
init();
for(int i = len - 1;i>=0;i--) {
if(str[i]!='.')
digit[size++] = str[i] - '0';
else
num = len - i - 1;
}
}
bigFloat operator + (const bigFloat &A) const {
bigFloat ret;
ret.init();
int s1,s2,left;
int d;
if(num - A.num > 0) {
d = num - A.num;
for(int i = 0;i<d;i++)
ret.digit[ret.size++] = digit[i];
s1 = ret.size;
s2 = 0;
left = A.num;
}
else {
d = num - A.num;
for(int i=0;i<d;i++)
ret.digit[ret.size++] = A.digit[i];
s1 = 0;
s2 = ret.size;
left = num;
}
int carry = 0;
while(left>0) {
int tmp = digit[s1++] + A.digit[s2++] + carry;
carry = tmp / 10;
ret.digit[ret.size++] = tmp % 10;
left--;
}
ret.num = ret.size;
for(s1=num,s2=A.num;s1<size || s2<A.size;s1++,s2++) {
int tmp = digit[s1] + A.digit[s2] + carry;
carry = tmp / 10;
ret.digit[ret.size++] = tmp % 10;
}
if(carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
void output() {
/* 输出整数部分 */
int count = size - num;
int i = size - 1;
bool ok = false;
if(count==1 && digit[i]==0) //对应特列 0.0 + 0.0
printf("%d",digit[i]);
else {
while(count>0) {
if(digit[i]!=0) //避免出现00008这种情况
ok = true;
if(ok)
printf("%d",digit[i]);
count--;
i--;
}
}
/* 始终要输出. 比如1.0,保留小数点 */
printf(".");
int j=0;
bool out = false;
for(int i = num -1;i>=0;i--) {
if(digit[i]==0)
j++;
else {
for(int k=i-j;k<=i;k++)
printf("%d",digit[k]);
j = 0;
out = true;
}
}
if(!out)
printf("0");
printf("\n");
}
}a,b;
char s1[100],s2[100];
int main() {
int n;
while(scanf("%d",&n)!=EOF) {
for(int i = 0;i<n;i++) {
scanf("%s",s1);
scanf("%s",s2);
a.set(s1);
b.set(s2);
a = a + b;
a.output();
}
}
return 0;
}
本题自己测试都没错,可是提交了就wrong answer了。
需要注意输出的问题如:
0.0 + 0.0 = 0.0
1.9 + 0.1 = 2.0
000001.3 + 2.2 = 3.5