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

来源:互联网 发布:fpga数据采集系统 编辑:程序博客网 时间:2024/06/06 12:46

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<stdio.h>#define SIZE 100000#define TEST1int 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;i<lenth;i++)                        {                                printf("%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. 先框架,后细节既然是“逻辑嵌套”,那应该遵循“由大到小,层层深入”的原则(这个貌似什么时候都是对的。。。)  

原创粉丝点击