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;
}