2738:实数加法
总时间限制: 1000ms
内存限制: 65536kB
描述
求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111 0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222
已accept的代码
#include<stdio.h>
#include<string.h>
#define MAX_LEN 100+10
int main(){
int ft1[MAX_LEN],ft2[MAX_LEN],n1[MAX_LEN],n2[MAX_LEN],i=0,j=0,k,ilen1,ilen2,flen1,flen2;
char line1[MAX_LEN],line2[MAX_LEN],num1[MAX_LEN],num2[MAX_LEN],flt1[MAX_LEN],flt2[MAX_LEN];
memset(ft1,0,sizeof(ft1));
memset(ft2,0,sizeof(ft2));
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n2));
memset(flt1,0,sizeof(flt1));
memset(flt2,0,sizeof(flt2));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
scanf("%s",line1);
scanf("%s",line2);
sscanf(line1,"%[^.].%s",num1,flt1);
sscanf(line2,"%[^.].%s",num2,flt2);
ilen1=strlen(num1);
ilen2=strlen(num2);
flen1=strlen(flt1);
flen2=strlen(flt2);
for(j=0,i=ilen1-1;i>=0;j++,i--){
n1[j]=num1[i]-'0';
}
for(j=0,i=ilen2-1;i>=0;j++,i--){
n2[j]=num2[i]-'0';
}
for(i=0;i<flen1;i++){
ft1[i]=flt1[i]-'0';
}
for(i=0;i<flen2;i++){
ft2[i]=flt2[i]-'0';
}
flen1=flen1>flen2?flen1:flen2;
for(i=flen1-1;i>0;i--){
ft1[i]+=ft2[i];
ft1[i-1]+=ft1[i]/10;
ft1[i]%=10;
}
ft1[0]+=ft2[0];
n1[0]+=ft1[0]/10;
ft1[0]%=10;
ilen1=ilen1>ilen2?ilen1:ilen2;
for(i=0;i<ilen1-1;i++){
n1[i]+=n2[i];
n1[i+1]+=n1[i]/10;
n1[i]%=10;
}
n1[ilen1-1]+=n2[ilen1-1];
for(i=flen1;ft1[i]==0;i--);
flen1=i;
for(i=ilen1;n1[i]==0&&i>0;i--);
ilen1=i;
for(i=ilen1;i>=0;i--){
printf("%d",n1[i]);
}
printf(".");
for(i=0;i<=flen1;i++){
printf("%d",ft1[i]);
}
}
debug:这次吸取了上次的教训,数组我直接无脑加十,总不会超时了吧,本以为会一遍过的,没想到卡了两个下午,都是在自己的电脑上可以,就是提交时Runtime error,先是测所有想得到的边界条件,后来怀疑是gets()对stdin的EOF识别不到位,前前后后不算小的改动,光是重写都有三遍,尝试用不同思路,不同函数,看着别的同学都写完下一个作业开始碎觉了,心累无爱,最后终于在一个同学的帮助下,发现只要删掉return 1;这一行就Accept了,我还试了试以前的一个版本果然删掉return后万事大吉,那感觉,太酸爽了。