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