PAT B 1024 科学计数法

题目

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

输入格式

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

输出格式:

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

输入样例

+1.23400E-03

输出样例

0.00123400

思路

image.png

代码

#include <stdio.h>
#include <string.h>
#define maxsize 20000

int main()
{
    char str[maxsize];
    gets(str);
    int length = strlen(str);
    int i=0,len0=0;
    if(str[0]=='-') //如果给出的数一开始就是负数,就直接打印负号 
     printf("-");
    while(str[i]!='E')
     i++;
    char sign = str[i+1];//读取E指数的符号 
    for(int j=i+2;j<length;j++)
     len0 = len0*10 +str[j]-'0'; //求出E指数的值,len0代表要添加的0的个数 
    if(len0==0) //特殊情况:E指数为0,直接输出原来的数值 
    {
        for(int j=1;j<i;j++)
         printf("%c",str[j]);
         return 0;
    }
    if(sign=='+') //如果E指数为正号 
    {
        int xiaoshu_len = i-3; //原输入数值的小数部分长度 
        if(xiaoshu_len<=len0) //如果小数部分的长度小于要添加的0的个数 
        {
            printf("%c",str[1]); //直接把整数和小数依次打印出来 
            for(int j=3;j<i;j++)
             printf("%c",str[j]); 
            for(int j=0;j<len0-(i-3);j++) //再添加0 
             printf("0");
        }
        else if(xiaoshu_len>len0) //如果小数部分的长度大于要添加的0的个数 
        {
            printf("%c",str[1]); //先打印整数部分 
            for(int j=3;j<3+len0;j++) //再打印len0个小数部分的数值 
             printf("%c",str[j]);
            printf(".");         //打印小数点 
            for(int j=3+len0;j<i;j++) //打印剩余的小数部分 
             printf("%c",str[j]);
        }
    }
    else if(sign=='-')
    {
        printf("0.");  //先打印0.,此时相当于把原数值右移了以为 
        for(int j=1;j<len0;j++) //所以此时打印len0-1个0即可 
         printf("0");
        printf("%c",str[1]); //打印整数部分 
        for(int j=3;j<i;j++) //依次打印小数部分 
         printf("%c",str[j]);
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容