1024 科学计数法

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

+1.23400E-03

输出样例 1:

0.00123400

输入样例 2:

-1.2E+10

输出样例 2:

-12000000000

printf("%c", *p ? *p : '0'); 注意*p是字符指针, 所以是'0', 不是0
scanf的正则表达式, []内是匹配的字符,^表示求反集,当遇到非集合内的字符时立即终止输入
scanf("%[^]"),和scanf("%s")的区别是:前者在读字符串的时候在遇到^符号后面的字符时候停止(不会读入那个终止符),而后者在遇到空白,换行时候终止
还要注意s数组不要开的太小, 不然会有一个测试点WA。


#include <stdio.h>

int main()
{
	char s[1000000];
	int n;
	scanf("%[^E]E%d", s, &n);
	
	char *p = s;
	
	if(*p == '-')	// 底数 
	{
		printf("-");
	}
	p ++;
	
	if(n >= 0)		// 指数 
	{
		printf("%c", *p);
		p ++;
		p ++;
		for(; n > 0; n--)
		{
			printf("%c", *p ? *p : '0');
			p ++;
		}
		if(*p)
		{
			printf(".");
			while(*p)
			{
				printf("%c", *p);
				p ++;
			}
		}
	}
	else
	{
		printf("0.");
		for(n ++; n < 0; n ++)
		{
			printf("0");
		}
		while(*p)
		{
			if(*p != '.')
			{
				printf("%c", *p);
			}
			p ++;
		}
	}
//	printf("%s %d", s, n);
	
	return 0;
}

  

关于scanf的正则表达式, 我参考了http://blog.chinaunix.net/uid-7210505-id-3200150.html

#include <cstdio>

int main()
{
	/*
	1. width 宽度,一般可以忽略,用法如:
	*/
//	char buf[10] = {0};
//	scanf("%5s", buf); //%5s,只取个字符
//	printf("%s\n", buf);
	
	/*
	2. 正则表达式 %*[width] [{h | l | I64 | L}]type
	前面带“*”号表示不保存变量。跳过符合条件的字符串
	*/
//	char szTmp[10] = {0};
//	scanf("%*s%s", szTmp); //%*s表示第一个匹配到的%s被过滤掉
//	printf("%s\n", szTmp);

	/*
	3. %[ ]表示要读入一个字符集合, 
	如果“[”后面第一个字符是“^”,则表示取反的意思,
	即求“[]”内字符集的补集。“[]”内的字符串可以是1或更多字符组成。
	空字符集(%[])是违反规定的,可导致不可预知的结果。
	%[^] 也是违反规定的。
	% [a-z] 读取在a-z之间的字符串
	*/
//	char szTmp[10] = {0};
//	scanf("%[^ ]", szTmp); //%[^ ]表示取遇到空格为止的字符串
//	printf("%s\n", szTmp);
	
	char szTmp[10] = {0};
	scanf("%*[^@]@%[^\.]", szTmp); //匹配从"@"到"."之间的字符
	printf("%s\n", szTmp);
	/*
	解释:“%*[^@]”表示滤掉“@”前的字符串,
	接下来的一个“@”表示耗掉一个“@”但不保存到变量中,
	大家可以将第二个“@”去掉试一试,输出结果 为“@gmail”,
	后面的%[^\.]匹配到“.”之前的字符,由于“.”是正则表达式的元字符,因此加了“\”来转义。
	*/
	
	return 0;
}

/*
sample input(1, 2, 3): 
hello, world!

output1:
hello

output2:
world!

output3:
hello,

sample input4:
teacherhu@gmail.com

output4:
gmail
*/

  

posted @ 2019-05-14 20:39  青衫客36  阅读(391)  评论(0编辑  收藏  举报