C语言科学计数法与小数形式转换

【问题描述】

编写一个程序,将用科学计数法输入的一个数转换成小数表示的形式输出。该科学计数法表示的数字由以下几部分构成:
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;
}