PTA |1024 科学计数法 分数 20 输入输出

153 阅读2分钟

PTA | 程序设计类实验辅助教学平台 (pintia.cn)

思路:首先把情况分为两大类:

1.指数小于0的情况:

例:-1.23E-3,转为普通数字:-0.00123,指数为3,则小数点后带2个0,规律如下:设指数为e,小数点后就有e-1个0。

2.指数大于等于0:这个又可以分成两个情况:

`指数长度小于小数`:例:+ 1.2345000E + 3,转为普通数字:1234.5000
`指数长度大于小数`:例:+ 1.23E + 3,转为普通数字:1230

假设输入的浮点数为3.14159E3,即3.14159乘以10的3次方,表示为3141.59。按照代码的逻辑,当i等于e+1时,即i等于4时,就会输出一个小数点'.',然后继续输出a[i]的值,即输出5,所以最终输出为3141.59。

读入问题

%[] 的意思是:读入此集合所限定的那些字符。 例如 %[A-Z] 是指接受大写字母,一旦遇到非大写字母便停止接受,而 %[^] 是指不要读入此集合所限定的那些字符。例如 % [^A-Z] 是指不接受大写字母,一旦遇到大写字母便停止接受。

code

#include<iostream>
#include<cstring>
using namespace std; 

char h,a[10001]={0};
int e;

int main()
{
    // 从输入中读取科学计数法表示的数字
    scanf("%c%c.%[0-9]E%d",&h,&a[0],a+1,&e);

    if(h=='-')printf("-"); // 如果符号为负数,输出负号

    // 指数小于0的情况
    if(e<0)
    {
        printf("0.");// 以0.开始头
        e=-e-1;
        while(e--)
        {
            printf("0"); // 输出足够的0,以满足指数要求
        }
        printf("%s",a); // 输出小数点后的部分
    }
    else   // 指数大于0的情况
    {
        for(int i=0;i<=e||a[i]!=0;i++)
        {
            // 从指数后面一位开始输出小数点
            if(i==e+1)
                printf(".");
            printf("%c",a[i]==0?'0':a[i]); // 输出小数点前后的数字
        }
    }
    
    return 0;
}