PAT乙级 1024. 科学计数法 (C语言)

1024. 科学计数法 (20)

题目
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]”.”[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留
输入格式
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999
输出格式
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
输入样例1
+1.23400E-03
输出样例1
0.00123400
输入样例2
-1.2E+10
输出样例2
-12000000000


题目分析:题目规定数值最长可以是9999个字节,而指数绝对值不超过9999。而题目还要求保留所有精度,因此必须用“字符串”来处理。

思路
/*将字符串分解为几个部分:符号整数小数指数符号指数,分别存储
* if(符号’-‘) 输出 ‘-’ //输出符号
*
* if(指数是0) 直接输出整数 .小数
* else if(指数符号’+’)
* {
* ……..if(指数>小数长度)
*……………. 直接输出整数和小数
*……………. 结尾补上(指数-小数长度个‘0’)
*…….. else
*……………. if(整数不为0) 输出整数
*……………. else if(整数是0) 不输出整数
* ……………. 输出小数(在整数后的 第(指数)位 输出小数点)
* }
* else(指数符号‘-’)
* {
*…….. 输出‘0.’
*…….. 输出(指数-1)个0
*…….. 输出整数、小数字符串
* }
* */

代码如下:

#include
#define SIZE 100000
#define TEST1
int main(void)
{
        char sign;//符号
        char integer;//整数
        char frac[SIZE];//小数
        char expSign;//指数符号
        int  exp;//指数
        char ch;

        sign = getchar();
        integer = getchar();
        getchar();//跳过小数点
        int lenth = 0;
        while((ch = getchar())!='E')
        {       
                frac[lenth++] = ch;
        }
        expSign = getchar();
        scanf("%d",&exp);

        #ifndef TEST1
        printf("%c%c.%sE%c%d\n",sign,integer,frac,expSign,exp);
        #endif

        if(sign == '-') printf("-");

        if(!exp)//先解决特殊情况
                printf("%c.%s\n",integer,frac);
        else if(expSign == '+')
        {
                if(exp>=lenth)//指数>=小数长度,这种情况不需要输出小数点,还可能在结尾补‘0’
                {
                        printf("%c%s",integer,frac);
                        for(int i = 0;i < exp - lenth ;i++)
                                putchar('0');
                        putchar('\n');
                }
                else
                {
                        if(integer != '0')      printf("%c",integer);
                        for(int i = 0;iprintf("%c",frac[i]);
                                if(i == exp-1)
                                        putchar('.');
                        }
                        putchar('\n');
                }

        }
        else//expSign == '-'
        {
                printf("0.");
                for(int i = 0; i < exp-1;i++)
                        putchar('0');
                printf("%c%s\n",integer,frac);
        }
        return 0;
}

小结&&赘述
  这一类“逻辑嵌套”的题目不算难,就是“费事儿”,需要很严谨,不然很容易某些地方犯错,然后因为是逻辑错误,所以还不那么好找,比较费事。但是我认为如果遵循以下的步骤,这一类题目会稍微“容易一些”。
1.不要忘记自己在干什么! 的确,这种题目有时候容易把自己绕晕,代码敲着敲着突然忘记了自己在干嘛。。。为了提示自己,我们需要(1)在开始敲代码前尽量详细地写下思路,不要怕花时间,这个帮助很大。             (2)多写注释,提醒自己做到哪里了
2. 先处理“特殊情况”。这样做,一方面不容易忽略特殊情况,另一方面,还能帮助接下来的代码少处理一些。
3. 先框架,后细节既然是“逻辑嵌套”,那应该遵循“由大到小,层层深入”的原则(这个貌似什么时候都是对的。。。)  

你可能感兴趣的:(PAT乙级)