这个题典型的模拟题,各种情况要考虑:
1.为0的情况
1)0
2)00
3)0.0
2.没有小数点的情况
1)16
2)100
3)001
4) 1
3.带小数点的情况
1)100.
2)100.00
3)01.00
4)1.010
5)12.1
6)00.0010
各种考虑,最后A掉,上代码吧
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAX = 1000010;
char s[MAX];
int main(){
while (scanf("%s", s) != EOF){
int len = strlen(s);
int pre = 0, end = len-1;
while (pre<len && s[pre]=='0' && s[pre]!='.'){ //除去首部的0
pre++;
}
while (end >=0 && s[end] == '0' && s[end] != '.'){ //除去末尾的0
end--;
}
int mark = 0;
for (int i = 0; i<len; i++) if (s[i] == '.'){ //判断是否具有小数点
mark = 1;
break;
}
if (mark == 0){ //如果不带小数点,末尾的0不能除去
end = len-1;
}
if (pre == end){ //值为个位数
if (s[pre] == '.'){
printf("0\n");
}else{
printf("%c\n",s[pre]);
}
continue;
}
if (pre > end){ //为0的一种情况 "0, 00"
printf("0\n");
continue;
}
int u = pre;
int e = 0, sign; //确定指数
if (s[pre] != '.'){ //若指数应该为正
sign = 1;
while (pre<=end && s[pre] != '.'){
e++;
pre++;
}
e--;
}else{ //若指数应该为负
sign = -1;
pre++;
e++;
while (s[pre] == '0'){
pre++;
e++;
}
}
if (s[end] == '.' || mark==0){ //当小数位为0或者不存在的时候,确定整数的最后一个非0数字,考虑到类似100 100. 100.00
while (s[end] == '0' || s[end]=='.'){
end--;
}
}
//输出结果
if (sign > 0){
printf("%c", s[u]);
if (u != end){
printf(".");
for (int i = u+1; i<=end; i++) if (s[i] != '.'){
printf("%c",s[i]);
}
}
if (e > 0){
printf("E%d",e);
}
printf("\n");
}else{
printf("%c", s[pre]);
if (pre != end){
printf(".");
for (int i = pre+1; i<=end; i++) {
printf("%c", s[i]);
}
}
if (e > 0){
printf("E%d", -1*e);
}
printf("\n");
}
}
return 0;
}