PAT_B_1024 科學計數法

題目描述:

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其知足正則表達式 [+-][1-9].[0-9]+E[+-][0-9]+,即數字的整數部分只有 1 位,小數部分至少有 1 位,該數字及其指數部分的正負號即便對正數也一定明確給出。
現以科學計數法的格式給出實數 A,請編寫程序按普通數字表示法輸出 A,並保證全部有效位都被保留。
輸入格式:
每一個輸入包含 1 個測試用例,即一個以科學計數法表示的實數 A。該數字的存儲長度不超過 9999 字節,且其指數的絕對值不超過 9999。
輸出格式:
對每一個測試用例,在一行中按普通數字表示法輸出 A,並保證全部有效位都被保留,包括末尾的 0。

輸入樣例 1:
+1.23400E-03
輸出樣例 1:
0.00123400
輸入樣例 2:
-1.2E+10
輸出樣例 2:
-12000000000

解題關鍵:

1. 利用字符串對數字的讀入;正則表達式

2. 對符號的判斷,正號沒必要輸出,負號必須輸出;測試

3. 對指數的討論,先把字符串轉化爲整數後分正負分別計算;spa

(1).指數爲負,則在符號位後直接輸出‘0.’,而後在小數點與第一位非0數之間插‘0’,沒必要再次輸出小數點;blog

(2).指數爲正,則判斷原字符串在小數點和E之間的長度len與指數exp的大小,再判斷小數點的位置。字符串

AC代碼:

// PAT_1024_科學計數法 
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define Max 100000

int main(void)
{
	char S[Max], S_num[Max]; 
	int i=0, j=0, exp, len=0;
	gets(S);
	// puts(S);
	// 輸出該數字的符號(數沒必要輸出) 
	if (S[0] == '-')
		printf("%c",S[0]); 
	while (S[i]!='E') i++;
	// 提取E後面的數字
	strcpy(S_num, S+i+1); 
	// puts(S_num);
	// 轉化爲整型數字 
	exp = atoi(S_num);
	// printf("%d\n",exp);
	// 指數分正負討論,負數時 
	if (exp<0) 
	{
		printf("0.");
		// 在小數點後面輸出0
		for (j=exp; j<-1; j++) 
			printf("0"); 
		// 輸出正負號到E之間的除小數點外的字符
		for (i=1; S[i]!='E'; i++) 
		{
			if (S[i]!='.')
				printf("%c",S[i]);
		}
	}
	// 指數爲正時 
	else
	{
		// 記錄小數點到E之間的字符串長度
		for (i=2; S[i]!='E'; i++)
		{
			if (S[i]!='.')
				len++;
		 } 
		 // 長度 
		 // printf("%d\n",len);
		 // 比較 指數exp 和 長度len 的大小
		 // exp>len 在最後補零,不用輸出 小數點 
		 if (exp >= len) 
		 {
		 	for (i=1; S[i]!='E'; i++)
		 	{
		 		if (S[i]!='.')
		 			printf("%c",S[i]);
			 }
			 for (i=0; i<exp-len; i++)
			 	printf("0");
		 }
		 // exp < len 在第exp位輸出小數點 
		 else
		 {
		 	 for (i=1; S[i]!='E'; i++)
			 {
			 	if (S[i] != '.')
			 		printf("%c",S[i]);
			 	if (i==exp+2)
			 		printf(".");
		     }
			  
		 } 
	}
	 
	return 0;
}

 RRRget

相關文章
相關標籤/搜索