ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1024 科学计数法

2019-05-14 20:48:04  阅读:373  来源: 互联网

标签:1024 字符 ++ scanf 科学 计数法 char printf szTmp


科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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
*/

  

标签:1024,字符,++,scanf,科学,计数法,char,printf,szTmp
来源: https://www.cnblogs.com/mjn1/p/10864451.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有