【PAT (Basic Level) Practice】——【字符串处理】1024 科学计数法

一【题目难度】

  • 乙级

二【题目编号】

  • 1024 科学计数法 (20 分)

三【题目描述】

  • 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [ + − ] [ 1 − 9 ] . [ 0 − 9 ] + E [ + − ] [ 0 − 9 ] + [+-][1-9].[0-9]+E[+-][0-9]+ [+][19].[09]+E[+][09]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
  • 现以科学计数法的格式给出实数 A A A,请编写程序按普通数字表示法输出 A A A,并保证所有有效位都被保留。

四【题目示例】

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

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

  • 输入样例 1:
    +1.23400E-03

  • 输出样例 1:
    0.00123400

  • 输入样例 2:
    -1.2E+10

  • 输出样例 2:
    -12000000000

五【解题思路】

  • 这个题难点是要分指数得正负数,处理方式有所不同,但是整体思想都是定位指数得位置,再提取指数,分别进行打印,主要思路如下:
    ①;指数为负:如果是负指数,最终形式一定是 0. x x x x … … 0.xxxx…… 0.xxxx,其中小数点后连续得0的个数为exp-1,而后面 x x x x … … xxxx…… xxxx的部分即为字母E的前面所有数字
    ②:指数为正:主要需要考虑小数点移动后的位置。当exp非零时,小数点应该添加在原标号为exp+2的数字后(下标从0开始)。但是也要注意如果原小数点和E之间的数字个数(pos-3)等于小数点右移位数exp,则说明小数点恰好在整个数的最右边,是不需要输出小数点的。最后再考虑由于exp较大的时候需要额外输出exp-(pos-3)个0
    ③:指数为零:只需要输出字母E的前面所有数字
  • Ps:题目中明明说到了“该数字的存储长度不超过9999Byte”,又因为一个char变量需要1Byte来存储,因此9999Byte就说明这个数字的长度不超过9999,但是我设置10000大小的数组却运行出错了,改成了10010才可以,这个我也不清楚为什么

六【最终得分】

  • 20分

七【代码实现】

#include<stdio.h>
#include<string.h>
int main()
{
    char str[10010];
    gets(str);
    int len = strlen(str);
    if(str[0] == '-')
    {
        printf("-");
    }
    int pos = 0;
    while(str[pos] != 'E')
    {
        pos++;
    }
    int exp = 0;
    for(int i = pos + 2;i<len;i++)
    {
        exp = exp * 10 + (str[i] - '0');
    }
    if(exp == 0)
    {
        for(int i = 1;i<pos;i++)
        {
            printf("%c",str[i]);
        }
    }
    if(str[pos + 1] == '-')
    {
        printf("0.");
        for(int i = 0;i<exp -1;i++)
        {
            printf("0");
        }
        printf("%c",str[1]);
        for(int i = 3;i<pos;i++)
        {
            printf("%c",str[i]);
        }
    }
    else
    {
        for(int i = 1;i<pos;i++)
        {
            if(str[i] == '.')
            {
                continue;
            }
            printf("%c",str[i]);
            if(i == exp + 2 && pos - 3 != exp)
            {
                printf(".");
            }
        }
        for(int i = 0;i<exp-(pos - 3);i++)
        {
            printf("0");
        }
    }
    return 0;
}

八【提交结果】

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值