1. 程式人生 > >【PAT-A】1073. Scientific Notation 寫題記錄

【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;
}