【问题描述】
编写一个程序,将用科学计数法输入的一个数转换成小数表示的形式输出。该科学计数法表示的数字由以下几部分构成:
1.底数部分是一个小数,小数点前后必有数字,而且都为有效数字。即:小数点前只有一位大于0的数字,小数点后的末尾数字不能为0。底数前没有表示符号的“+”、“-”字符。
2.必有字母“e”或“E”。
3.指数部分是一个整数(小于100),也可能带有前缀的“+”、“-”号。
注意:转换后小数点后应均为有效数字,即末尾不含数字0,若无有效数字,则不输出小数点。
提示:可按字符串形式存储相关数据。
【输入形式】
控制台输入用科学计数法表示的一个数,其是一个不含空格的字符串,字符个数不会超过50,最后会有回车换行符。
【输出形式】
以小数形式输出该科学计数法表示的数。
【输入样例1】
2.569e-8
【输出样例1】
0.00000002569
【输入样例2】
8.9845623489650017659e5
【输出样例2】
898456.23489650017659
【输入样例3】
3.67298599990099E+42
【输出样例3】
3672985999900990000000000000000000000000000
【样例说明】
以科学计数法输入数据,然后转换后以小数形式输出,注意:样例3中输入的数据转换后无小数部分,小数点就不再输出。
#include <stdio.h>
int main()
{
char str[200] = {0};
fgets(str, 60, stdin);
int flag = 1, //指数正负标记
dot = 1, //小数点位置
e = 0, // E所在位置
po = 0, //指数位置
mi = 0, //指数
i, j;
i = dot + 1;
while (str[i] != '\n') // fget会带回输入的回车符
{
if (str[i] == 'e' || str[i] == 'E')
{
e = i;
po = e + 1;
if (str[e + 1] == '-')
{
flag = -1;
po = e + 2;
}
else if (str[e + 1] == '+')
po = e + 2;
}
i++;
}
str[i] = '\0';
//解析指数
for (i = po; str[i]; i++)
{
mi = mi * 10 + (str[i] - '0');
}
str[e] = '\0';
if (flag > 0) //指数为正
{
j = dot;
for (i = 0; i < mi && j < e - 1; i++, j++) //小数点后移
str[j] = str[j + 1];
for (; i < mi; i++) //末尾补零
str[j++] = '0';
if (j > e)
str[j] = '\0';
else
str[j] = '.';
}
else
{
str[1] = str[0];
j = e - 1;
for (i = 0; i < mi && j > 0; i++) //所有数字后移mi位
{
str[j + mi] = str[j];
j--;
}
for (j = mi; j >= 0; j--) //前面补零
{
str[j] = '0';
}
str[1] = '.';
}
printf("%s\n", str);
return 0;
}