PAT乙级.1024. 科学计数法 (20)

1024. 科学计数法 (20)


题目

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

PAT链接


思路:

1.读取字符串,将底数单独提取出来(滤去小数点)

    base[0] = str[1];   //获得小数点前的数字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最后比实际多1
    }

2.提取指数字符,获得指数数字exp

    //获得指数数字
    i++;
    if(str[i] == '-')   flag = 1;
    for(i++; str[i] != '\0'; i++)
    {
        exp = exp*10;
        exp += str[i] - '0';
    }

3.exp为正,意味着小数点右移,比较exp 与 len_base-1,判断是否还需要输出小数点,然后分情况输出
4.exp为负,意味着小数点左移,要先输出“0.”计算还需要输出的0的个数,之后输出底数base

        if(flag)    //如果指数为负数,向右移位
        {
            printf("0.");
            while(--exp)    printf("0");
            for(int k = 0; k<len_base; k++)    printf("%c",base[k] );
        }

5.exp为0,不需要移位,直接输出


代码:

/**
* @tag     PAT_B_1024
* @authors R11happy (xushuai100@126.com)
* @date    2016-8-23 23:52-0:52
* @version 1.0
* @Language C++
* @Ranking  435/1515
* @function null
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>

int main(int argc, char const *argv[])
{
    int i, len_base=1;
    int index = 0;
    int exp = 0;
    int flag = 0;   //记录指数正负
    char str[10010];    //一个char 1 byte,9999byte 至少开10000
    char base[10010];
    gets(str);
    if(str[0] == '-')   printf("-");
    base[0] = str[1];   //获得小数点前的数字
    for( i =3; str[i] != 'E'; i++, len_base++)
    {
        base[len_base] = str[i];   //注意:len_base最后比实际多1
    }
    //获得指数数字
    i++;
    if(str[i] == '-')   flag = 1;
    for(i++; str[i] != '\0'; i++)
    {
        exp = exp*10;
        exp += str[i] - '0';
    }
    //如果exp不为0, 需要进行移位
    if(exp)
    {
        if(flag)    //如果指数为负数,向右移位
        {
            printf("0.");
            while(--exp)    printf("0");
            for(int k = 0; k<len_base; k++)    printf("%c",base[k] );
        }
        else    //指数为正数,向左移位
        {
            if(exp < len_base-1) //移位后还需要输出小数点
            {
                //注意index作用域,开始误写成int index = 0, 结果对输入
                //-3.1415926E+4会输出-31415.31415926
                for(index = 0; index<= exp; index++)    printf("%c",base[index] );
                printf(".");
                for(; index < len_base; index++)   printf("%c",base[index] );
            }
            else    //移位后不用输出小数点
            {
                for(int k = 0; k < len_base; k++)  printf("%c",base[k] );
                for(int k = 0 ; k < exp - len_base+1; k++)   printf("0");
            }
        }
    }
    //如果exp0,不用移位,直接输出
    else
    {
        for(int k = 1; str[k] != 'E'; k++)
            printf("%c",str[k] );
    }
    return 0;
}

收获:

1.一个char占1byte,9999byte至少要开char [10000]
2.注意i,j,k的作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值