思路:同乙级1024。先找到 E 的位置,用 flag_E 标记一下。然后计算 flag_E+2 位置一直到末尾的数,计算指数大小 exp。然后根据 E 后面的 “+-” 号分类讨论。
“-”:先判断字符串第一项是否为 “-”,“-” 输出,“+” 不输出。然后先输出 “0.”。再输出格式为 0.000XXX。小数点后连续 0 的个数为 exp-1,然后 XXX 就是原字符串 str[3] 一直到 str[flag_E-1] 的数字。
“+”:分三种情况讨论:
1.exp 小于小数点后的数字个数。照样先判断是否输出 “-”,然后从 str[3] 一直输出到 str[exp+2],再输出一个 “.”,最后输出剩余数字。
2.exp 正好等于小数点后数字个数。那么就不用输出 “.”。
3.exp 大于小数点后的数字个数。照样先判断是否输出 “-”,然后从 str[3] 一直输出到 str[flag_E-1],这里 exp 要递减。最后,输出 exp 更新后的个数的 “0”。
代码:
#include<cstdio>
#include<cstring>
int main(){
char str[10010];
scanf("%s",str);
int n = strlen(str);
int flag_E = -1;
for(int i = 0;i < n; i ++){
if(str[i] == 'E'){
flag_E = i;
break;
}
}
int exp = 0;
//计算指数
for(int i = flag_E + 2;i < n;i ++){
exp = exp*10 + (str[i] - '0');
}
//特判
if(exp == 0){
for(int i = 0;i < n;i ++){
printf("%c",str[i]);
}
}
//负号
if(str[flag_E + 1] == '-'){
if(str[0] == '-'){ //判断首位是否为'-','-'要输出
printf("%c",str[0]);
}
printf("0.");
for(int i = 0;i < exp-1;i ++){ //小数点后连续0的个数
printf("0");
}
printf("%c",str[1]);
for(int i = 3;i < flag_E;i ++){
printf("%c",str[i]);
}
}
//正号
else{
if(exp < flag_E-3){
if(str[0] == '-'){
printf("-");
printf("%c",str[1]);
}
else{
printf("%c",str[1]);
}
for(int i = 3;i <= exp+2;i ++){
printf("%c",str[i]);
}
printf("."); //输出小数点
for(int i = exp+3;i < flag_E;i ++){
printf("%c",str[i]);
}
}
else if(exp == flag_E-3){ //不用输出小数点
if(str[0] == '-'){
printf("-");
printf("%c",str[1]);
}
else{
printf("%c",str[1]);
}
for(int i = 3;i <= exp+2;i ++){
printf("%c",str[i]);
}
}
else{
if(str[0] == '-'){
printf("%c%c",str[0],str[1]);
}
else{
printf("%c",str[1]);
}
for(int i = 3;i < flag_E;i ++){
printf("%c",str[i]);
exp --; //exp要递减,进行更新
}
for(int i = 0;i < exp;i ++){ //输出0
printf("0");
}
}
}
return 0;
}
版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~