Problem Description
读入两个字符串,字符串除了数字还可能包括 '—'、'E'、'e'、'.',相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。
Input Description
输入包含多组测试数据。
每组输入占两行,每行一个字符串,测试数据保证字符串的构成严格按照题目中的描述。
Output Description
输出两个数字相加的结果,每组输出占一行。
Sample Input
34.56 2.45e2
Sample Output
2.7956e2
#include<stdio.h>
char s1[10000];
char s2[10000];
void qiuhe(char *str1, char *str2)
{
long long s = 0;
long long s1 = 0;
long long s2 = 0;
long long ans = 0;
int i, a1, a2, a, b, c, d, flag;
s1 = s2 = a1 = b = c = flag = 0;
for(i = 0 ; str1[i] ; 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 == 1)
{
s1 = -s1;
}
flag = b = c = a2 = 0;
for(i = 0 ; str2[i] ; 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 == 1)
{
s2 = -s2;
}
if(a1 < a2)
{
for( ; a1 < a2 ; a2--)
{
s2 *= 10;
}
}
else if(a1 > a2)
{
for( ; a1 > a2 ; a1--)
{
s1 *= 10;
}
}
a = a1;
s = s1 + s2;
if( !s)
{
printf("0\n");
return ;
}
while(a < 0 && s % 10 == 0)
{
s /= 10;
a++;
}
if(a >= 0)
{
printf("%lld",s);
for(i = 0 ; i < a ; i++)
{
printf("0");
}
printf("\n");
return ;
}
flag = 0;
if(s < 0)
{
s = -s;
flag = 1;
}
ans = 1;
d = 0;
while(ans <= s)
{
ans *= 10;
d++;
}
if(ans > 1)
{
ans /= 10;
d--;
}
if(flag == 1)
{
printf("-");
}
printf("%lld",s/ans);
if(ans > 1)
{
printf(".%lld",s%ans);
}
printf("e%d\n",a+d);
}
int main()
{
while(scanf("%s %s",s1,s2) != EOF)
{
qiuhe(s1, s2);
}
return 0;
}
Hint
提示:
表示字符串的数据结构依然是字符数组。
总结:
KMP算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。