【PAT乙级】1024 科学计数法

目录

  • 一、题目
  • 二、我的AC代码


一、题目

1024 科学计数法 (20分)

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

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

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

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

输入样例 1:

+1.23400E-03

输出样例 1:

0.00123400

输入样例 2:

-1.2E+10

输出样例 2:

-12000000000

代码长度限制			 16 KB
时间限制				200 ms
内存限制				 64 MB


二、我的AC代码

/************************************************************
    读取的时候用到了一种格式化读取字符串的方法  %[^...]  ,
    这和%s类似,不过会终止于[^]里面的字符,而不是空白字符,
    利用这个可以简单的读取'E'前后的两个数。
************************************************************/

#include 
#include 

#define MAX 9999  											//输入的数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。

int main(void)
{
    /* 读取数字的底数部分和指数部分 */
    char base[MAX+1];  										//底数部分。
    int exponent;  											//指数部分。
    scanf("%[^E]E%d", base, &exponent);  					//使用格式化读取字符串的方法。
    
    /* 计算底数部分的字符串长度 */
    int baseLength;  										//底数字符串的长度。
    baseLength = strlen(base);
    
    /* 判断是否需要输出负号 */
    if(base[0] == '-'){
        printf("-");  										//若底数为负,则输出负号;若底数为正,则不需要输出负号。
    }
    
    /* 当指数部分大于0时 */
    if(exponent > 0){
        
        printf("%c", base[1]);  							//先输出小数点前的整数部分。
        
        /* 将底数部分的小数点后移 */
        for(int i=3; i<baseLength; i++, exponent--){
            if(exponent == 0){
                printf(".");  								//小数点后移结束时,输出小数点。
            }
            printf("%c", base[i]);
        }
        
        /* 底数部分位数不足,末尾补零 */
        for(exponent; exponent>0; exponent--){
            printf("0");
        }
        
    /* 当指数部分小于0时 */
    }else if(exponent < 0){
        
        exponent = -exponent;  								//先将指数部分从负数变为正数。
        
        /* 底数部分前面添零 */
        for(int i=0; i<exponent; i++){
            if(i == 0){
                printf("0.");  								//第一个零后面有一个小数点。
            }else{
                printf("0");
            }
        }
        
        /* 输出底数部分的数字 */
        for(int i=1; i<baseLength; i++){
            if(base[i] == '.'){
                continue;  									//底数部分的小数点不输出。
            }else{
                printf("%c", base[i]);
            }
        }
        
    /* 当指数部分等于0时 */
    }else if(exponent == 0){
        
        printf("%s", &base[1]);  							//从存放底数部分的数组的第二位地址开始输出字符串。
        
    }
    
    printf("\n");
    return 0;
}


你可能感兴趣的:(PAT,pat考试,c语言)