思路:先找到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;
}

版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~