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