Problem A: 字符串处理.读入两个字符串,字符串除了数字还可能包括 ‘—‘、‘E‘、‘e‘、‘.‘,相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。

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算法调用很简单,但难的是理解算法的思想。掌握算法的思想才能说是掌握算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值