【PAT-A】1073. Scientific Notation 写题记录

写题的时候没看见整数部分从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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43456345/article/details/85071308
今日推荐