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。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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 @   青衫客36  阅读(392)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示