参考代码
#include <cstdio>
#include <cstring>
int main(){
char str[10010];
gets(str);
int len=strlen(str);
if(str[0]=='-') printf("-");//如果是负号,则输出负号
int pos=0;//pos存放字符串中E的位置
while(str[pos]!='E'){
pos++;
}
int exp=0;//exp存放指数(先不考虑正负)
for(int i=pos+2;i<len;i++){
exp=exp*10+(str[i]-'0');
}
if(exp==0){//特判指数为0的情况
for(int i=1;i<pos;i++){
printf("%c",str[i]);
}
return 0;
}
if(str[pos+1]=='-'){//如果指数为负
printf("0.");
for(int i=0;i<exp-1;i++){//输出(exp-1)个0
printf("0");
}
printf("%c",str[1]);//输出除了小数点以外的数字
for(int i=3;i<pos;i++){
printf("%c",str[i]);
}
}else{//如果指数为正
for(int i=1;i<pos;i++){//输出小数点移动之后的数
if(str[i]=='.') continue;//略过原小数点
printf("%c",str[i]);//输出当前数位
if(i==exp+2&&pos-3!=exp)//小数点加在为位置(exp+2)上
//原小数点和E之间的数字个数(pos-3)不能等于小数点右移位数exp
printf(".");
}
//如果指数exp较大,输出多于的0
for(int i=0;i<exp-(pos-3);i++){
printf("0");
}
}
return 0;
}
遇到的问题以及解决方案:
1,如何具体找到字符串中的数字以及指数部分,还有正负号如何分离,实际上并没有通过什么库函数来分离,第一个字符为正负号,然后通过for循环if(str[i]=='E')就可以找到E的位置,然后E后面两位就是指数了
2,这里的指数02 004 3 10如何转换,exp=exp*10+(str[i]-'0');这段代码实在是很好,第一实现了002提取2,也实现了10 1*10+0,字符加减字符输出的是这两个字符相差的ASCLL数
3,其中指数为正负时,添0和移动小数点的代码部分很精髓,只要认真分析不难得出。很好的题目,多回顾。