• 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
    ", buf);
    	
    	/*
    	2. 正则表达式 %*[width] [{h | l | I64 | L}]type
    	前面带“*”号表示不保存变量。跳过符合条件的字符串
    	*/
    //	char szTmp[10] = {0};
    //	scanf("%*s%s", szTmp); //%*s表示第一个匹配到的%s被过滤掉
    //	printf("%s
    ", szTmp);
    
    	/*
    	3. %[ ]表示要读入一个字符集合, 
    	如果“[”后面第一个字符是“^”,则表示取反的意思,
    	即求“[]”内字符集的补集。“[]”内的字符串可以是1或更多字符组成。
    	空字符集(%[])是违反规定的,可导致不可预知的结果。
    	%[^] 也是违反规定的。
    	% [a-z] 读取在a-z之间的字符串
    	*/
    //	char szTmp[10] = {0};
    //	scanf("%[^ ]", szTmp); //%[^ ]表示取遇到空格为止的字符串
    //	printf("%s
    ", szTmp);
    	
    	char szTmp[10] = {0};
    	scanf("%*[^@]@%[^.]", szTmp); //匹配从"@"到"."之间的字符
    	printf("%s
    ", szTmp);
    	/*
    	解释:“%*[^@]”表示滤掉“@”前的字符串,
    	接下来的一个“@”表示耗掉一个“@”但不保存到变量中,
    	大家可以将第二个“@”去掉试一试,输出结果 为“@gmail”,
    	后面的%[^.]匹配到“.”之前的字符,由于“.”是正则表达式的元字符,因此加了“”来转义。
    	*/
    	
    	return 0;
    }
    
    /*
    sample input(1, 2, 3): 
    hello, world!
    
    output1:
    hello
    
    output2:
    world!
    
    output3:
    hello,
    
    sample input4:
    teacherhu@gmail.com
    
    output4:
    gmail
    */
    

      

  • 相关阅读:
    逆向工具的使用
    linux下用crunch工具生成密码
    Bugku--web-wp
    stegsolve.jar压缩包打开和使用方法
    华为eNSP无限井号#解决方法
    后渗透之meterpreter使用攻略
    后渗透2
    Raid磁盘阵列存储原理-数据恢复思路分析
    Office文档损坏或乱码如何修复
    遇到ZFS文件系统如此棘手的问题,这种办法简单又高效!
  • 原文地址:https://www.cnblogs.com/mjn1/p/10864451.html
Copyright © 2020-2023  润新知