B1024/A1073. 科学计数法 (20)

来源:互联网 发布:ubuntu系统软件位置 编辑:程序博客网 时间:2024/05/18 16:35

1.题目描述

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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

2.解题过程

第一遍代码如下:

/*B1024*/#define NUM 10000#include<cstdio>#include<cstring>int main(){    int e = -1;  //记录e的位置    int f = -1;  //记录小数点的位置    int m = 0;  //记录指数    bool flag = true;  //指数为正是true,指数为负是false    bool flag2 = true;  //数为正是true,负是false    char a[NUM];     gets(a);    int length = strlen(a);    if(a[0]=='-'){        flag2 = false;    }    for(int i=0;i<length;i++){        if(a[i]=='E'){            e = i;        }        if(a[i]=='.'){            f = i;        }        if(e!=-1&&a[e+1]=='-'){            flag = false;        }    }    //提取指数    for(int i=e+1;i<length;i++){        if(a[i]=='+'||a[i]=='-')            continue;        else{            m = m*10 + (a[i]-'0');        }    }    if(flag){  //指数为正        if(flag2){  //数为正            if(a[0]!='+')                printf("%c",a[0]);            else                printf("%c",a[1]);        }else{  //数为负            printf("%c%c",a[0],a[1]);        }        int i;            for(i=f+1;i<e&&m;i++){                printf("%c",a[i]);                m--;            }            if(m==0){                if(i<e)                    printf(".");                for(i;a[i]!='E';i++){                    printf("%c",a[i]);                }            }else{  //末尾添0                while(m){                    printf("0");                    m--;                }            }    }else{  //指数为负        printf("0.");        m--;        while(m){            printf("0");            m--;        }        for(int i=0;a[i]!='E';i++){            if(a[i]=='.')                continue;            else                printf("%c",a[i]);        }    }    return 0;}

有两个测试点未通过

错误分析:
在数和指数都为负数是的输出格式中没有忽略原来的“-”号,情况如下:

修改部分代码:

else{  //指数为负        if(!flag2){  //数为负            printf("-");        }        printf("0.");        m--;        while(m){            printf("0");            m--;        }        for(int i=0;a[i]!='E';i++){            if(a[i]=='.'||a[i]=='-'||a[i]=='+')                continue;            else                printf("%c",a[i]);        }    }

提交后结果全部正确。

3.基础知识复习

由于长时间不用C语言编程,很多基本编程规则已经淡忘,因此每题最后将设计的基础知识进行简单罗列,以便之后复习。
1)printf输出
%d整数 %ld长整型long %lld双长整型long long
%c输出一个字符
%s输出一个字符串
%f以小数形式输出实数,包括单、双精度、长双精度
%m.nf输出数据占m列,其中小数n列,四舍五入
%-m.nf输出数据向左对齐,右端空格补足
%e以指数形式输出,默认数字部分小数位6位,指数部分5列,空格补足eg: 1.23e+002(数的前面有4个空格)
%o以八进制整数形式输出
%x以十六进制形式输出整数
2)gets()
接收一个字符串末尾会自动添加‘\0’
只能以回车键作为分割符
可以包含转义字符
读取字符串直到换行符结束,换行符会被丢弃然后加上‘\0’
3)strlen()
使用时记得加头文件#include cstring

原创粉丝点击