PAT Basic 1024. 科学计数法

PAT Basic 1024. 科学计数法

1. 题目描述:

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 \(A\),请编写程序按普通数字表示法输出 \(A\),并保证所有有效位都被保留。

2. 输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 \(A\)。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

3. 输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

4. 输入样例:

+1.23400E-03
-1.2E+10

5. 输出样例:

0.00123400
-12000000000

6. 性能要求:

Code Size Limit
16 KB
Time Limit
200 ms
Memory Limit
64 MB

思路:

根据题目描述有科学计数法的整数部分固定只有1位,所以这里关键需要处理下数字和指数的符号以及小数部分和指数部分,最关键的地方就是根据指数部分左移或右移小数点,并且可能需要额外补充'0'字符。

另外就是输入保证存储长度不超过9999字节,指数绝对值不超过9999,我的理解是它直接把输入看作字符串,所以字符串长度不超过9999,另外指数绝对值不超过9999,最坏的情况也就是要额外加9999个'0',所以我这里用于存储输入和输出的字符长度都定义为了20000。

这里还用到了2个库函数:

int sscanf(const char *str, const char *format, ...)
char *strncpy(char *dest, const char *src, size_t n)

sscanf()还是比较骚的操作,应该是当时从大佬题解那里看到的:PAT-Basic-1024. 科学计数法 – Lnyan's Blog (llonely.com)

My Code:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char num[20000], *pchar;
    char res[20000];
    int numSign = 0, expSign = 0, decimalCount = 0, expCount = 0;
    
    scanf("%s", num);
    
    if(num[0] == '+') // check sign of number
        numSign = 1; //positive
    else
        numSign = 0; //negative
    
    pchar = num + 3;
    while(*pchar != 'E')
    {
        decimalCount++;
        pchar++;
    }
    
    pchar++; // check sign of exponential
    if(*pchar == '+')
        expSign = 1; //positive
    else
        expSign = 0; //negative
    
    pchar++; // get exponential number
    sscanf(pchar, "%d", &expCount);
    
    
    pchar = res;
    if(!numSign) // number is negative
    {
        *pchar = '-';
        pchar++;
    }
    
    
    if(expSign) // postive
    {
        if(expCount >= decimalCount) // need add extra '0'
        {
            *pchar = num[1];
            pchar++;
            
            strncpy(pchar, num+3, decimalCount);
            pchar += decimalCount;
            for(int i=expCount-decimalCount; i>0; i--)
            {
                *pchar = '0';
                pchar++;
            }
            *pchar = '\0';
        }
        else // expCount < decimalCount
        {
            *pchar = num[1];
            pchar++;
            
            strncpy(pchar, num+3, expCount);
            pchar += expCount;
            
            *pchar = '.';
            pchar++;
            
            strncpy(pchar, num+3+expCount, decimalCount-expCount);
            pchar += (decimalCount-expCount);
            
            *pchar = '\0';
        }
    }
    else // exponential sign is negative
    {
        if(!expCount)
        {
            strncpy(pchar, num+1, decimalCount+2);
            pchar += (decimalCount+2);
            *pchar = '\0';
        }
        else // need add extra '0'
        {
            *pchar = '0';
            pchar++;
            *pchar = '.';
            pchar++;
            
            for(int i=0; i<expCount-1; i++)
            {
                *pchar = '0';
                pchar++;
            }
            
            *pchar = num[1];
            pchar++;
            
            strncpy(pchar, num+3, decimalCount);
            pchar += decimalCount;
            
            *pchar = '\0';
        }
    }
    
    printf("%s\n", res);
    
    return 0;
}
posted @ 2023-03-13 15:42  十豆加日月  阅读(8)  评论(0编辑  收藏  举报