C语言 · 2022年5月19日 0

科学计数法与小数形式转换

【问题描述】

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

【评分标准】

该题要求以小数点形式输出数据,提交程序文件名为decimal.c或decimal.cpp。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
    char n[50], a[50] = "00000000000000000000000000000000000000000000000000", b[50], temp;//2.569e-8 0000000002569
    scanf("%s", n);
    int i, j, ex, len = 0;
    for(i=0;n[i] != 'e' && n[i] != 'E';i++)
    {
        if(n[i] == '.')
        {
            for(;n[i+1] != 'e' && n[i+1] != 'E';i++)
            {
                a[i] = n[i+1];
            }
        }
        else
        {
            a[i] = n[i];
        }
    }
    len = i;
    for(j=i+1;n[j-1] != '\0';j++)
    {
        b[j-i-1] = n[j];
    }
    if(atoi(b) >= 0)
    {
        ex = atoi(b);
        for(int k=49;k>=ex+1;k--)
        {
            a[k] = a[k-1];
        }
        a[ex+1] = '.';
        int max;
        if(len > ex)
        {
            if(len <= 4 && ex == 2)
            {
                max = len-2;
            }
            else
            {
                max = len-1;
            }
            
        }
        else
        {
            max = ex;
        }
        for(int k=0;k<=max;k++)
        {
            printf("%c", a[k]);
        }
    }
    else
    {
        ex = sqrt(pow(atoi(b),2));
        for(int count=0;count<=ex;count++)
        {
            temp = a[49];
            for(int k=49;k>0;k--)
            {
                a[k] = a[k-1];
                
            }
            a[0] = temp;
        }
        a[1] = '.';
        for(int k=0;k<ex+len;k++)
        {
            printf("%c", a[k]);
        }
    }
    printf("\n");
    return 0;
}