写题的时候没看见整数部分从1-9,考虑了0的情况,写了很多版本,选了个最精简的。
#include <cstdio>
#include <cstring>
int main(){
char input[10010];
scanf("%s",&input);
input[strlen(input)]='\0';
int locE=1;
while(input[locE]!='E'){ //找到E的坐标locE
locE++;
}
int p=0,i=locE+2;
while(input[i]!='\0'){ //获取指数
p=p*10+(input[i++]-'0');
}
if (input[0]=='-') printf("-");
if (input[locE+1]=='-'){ //若p为-,则不管整数是否0都是加往前加0
printf("0.");
for (int i=1;i<p;i++){
printf("0");
}
for(int i=1;i<locE;i++){
if (input[i]!='.') printf("%c",input[i]);
}
}
else{ //如果整数部分是0
int num=1;
if (input[1]=='0'){ //计算开头连续0的个数
for (int i=3;i<locE;i++){
if (input[i]=='0') num++;
else break;
}
}
for (int i=1;i<locE;i++){ //确定小数点,能点就点
if (input[i] == '.') continue; //如果遇到小数点,直接下一个
else if (input[1]=='0' && i<num+2 && i<p+3) ;
//如果整数是0,i还在小数点之前的连续0中,那就不做动作
else printf("%c",input[i]); //否则输出
if (i == p+2 && i<locE-1) { //如果到了该点小数点处,并且不在末尾
if (input[1]=='0' && i<num+2) printf("0.");
//如果整数为0,小数点要点在连续0中,就加0.
else printf("."); //否则直接加点
}
}
for (int i=0;i<p-locE+3;i++) printf("0"); //有多余的0的话输出
}
return 0;
}