[提交] [统计] [提问]
题目描述
读入两个字符串,字符串除了数字还可能包括 ‘—’、‘E’、‘e’、’.’,相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。
输入描述
输入包含多组测试数据。
每组输入占两行,每行一个字符串,测试数据保证字符串的构成严格按照题目中的描述。
输出描述
输出两个数字相加的结果,每组输出占一行。
输入样例
34.56
2.45e2
输出样例
2.7956e2
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
char str1[100],str2[100];
int main()
{
long long s,s1,s2,ans;
int a1,a2,a,b,c,w,flag,i;
int h1, h2;
while(~scanf("%s %s",str1,str2))
{
h1 = strlen(str1);
h2 = strlen(str2);
s1=0;
s2=0;
flag=0;
b=0;
c=0;
a1=0;
for(i=0; i < h1; i++)
{
if(str1[i]=='-') flag=1;
else if(str1[i]=='.') c=1;
else if(str1[i]=='e'||str1[i]=='E')
{
sscanf(str1+i+1,"%d",&b);
a1+=b;
break;
}
else
{
s1=s1*10+str1[i]-'0';
a1-=c;
}
}
if(flag) s1=-s1;
flag=0;
b=0;
c=0;
a2=0;
for(i=0; i < h2; i++)
{
if(str2[i]=='-') flag=1;
else if(str2[i]=='.') c=1;
else if(str2[i]=='e'||str2[i]=='E')
{
sscanf(str2+i+1,"%d",&b);
a2+=b;
break;
}
else
{
s2=s2*10+str2[i]-'0';
a2-=c;
}
}
if(flag) s2=-s2;
if(a1<a2)
{
while(a1<a2)
{
s2*=10;
a2--;
}
}
else if(a1>a2)
{
while(a1>a2)
{
s1*=10;
a1--;
}
}
a=a1;
s=s1+s2;
if(!s)
{
printf("0\n");
continue;
}
while(a<0&&s%10==0)
{
s/=10;
a++;
}
if(a>=0)
{
printf("%lld",s);
for(int i=0; i<a; i++)
printf("0");
puts("");
continue;
}
flag=0;
if(s<0)
{
s=-s;
flag=1;
}
ans=1,w=0;
while(ans<=s)
{
ans*=10;
w++;
}
if(ans>1)
{
ans/=10;
w--;
}
if(flag) printf("-");
printf("%lld",s/ans);
if(ans>1) printf(".%lld",s%ans);
printf("e%d\n",a+w);
}
return 0;
}