PAT A1073指数表記(20分)

科学的な表記法は、科学者が簡単に非常に大きな数値や非常に小さな数字を扱うことの方法です。表記は、正規表現と一致する[±] [1-9] [0-9] + E [±] [0-9]に少なくとも1桁ある整数部分は正確に一つの桁を有することを意味し、+小数部分、そして、彼らは正の場合であっても、数とその指数の符号は常に用意されています。
今、科学表記法で実数A与えられた、あなたは、すべての重要な数字を維持しながら、従来の表記でAをプリントすることになっています。

入力仕様:

各入力には、一つのテストケースが含まれています。各場合について、科学的表記で実数Aを含有する一行があります。数は、長さがせいぜい9999バイトでなく、指数の絶対値がこれ以上9999以下です。

出力仕様:

各テストケースのために、すべての有効数字と一列従来の表記の入力数Aの印刷は、後続ゼロを含む、維持しました。

サンプル入力1:

+ 1.23400E-03

サンプル出力1:

0.00123400

サンプル入力2:

-1.2E + 10

出力例2:

-12000000000

質問の意味:

表される科学的表記法の所定の数は、多数の一般的な表現が決定されます。

アイデア:

(1)セットのPOS 'E'の位置を表し、expは指数の設定値を表し、
(2)サブPOS + 1 == ' - 'またはPOS + 1 == '+'の2つのケースが議論:最初の「0」、EXP-1と、出力A「0」、最終的な出力数値文字列ではない「第一の出力は、ケース」; 2例を議論するための第2のケースの必要性:CASE1:小数未満の係数長さ(EXP部<POS-3「」) 、デジタル出力はEXP + 2のストリング出力、ケース2の位置ではないが「 『:EXP> 』。」= POS-3、 最初のデジタル出力はありません次に、文字列、出力EXP-(POS-3) '0'。

コード:

#include <cstdio>
#include <cstring>
int main(){
	char str[99999];
	scanf("%s",str);
	int len=strlen(str); 
	if(str[0]=='-')
		printf("-");
	int pos=1;//'E'的位置
	for(int i=1;i<len;i++){
		if(str[i]!='E')
			pos++;
		else
			break;
	} 
	int exp=0;//系数的值
	for(int i=pos+2;i<len;i++){
		exp=exp*10+(str[i]-'0');
	}
	if(str[pos+1]=='-'){
		printf("0.");
		for(int i=0;i<exp-1;i++){
			printf("0");
		}
		for(int i=1;i<pos;i++){
			if(i==2)continue;
			printf("%c",str[i]);
		}
	}else{
		if(exp<pos-3){
			for(int i=1;i<pos;i++){
				if(i==2)continue;
				printf("%c",str[i]);
				if(i==exp+2)
					printf(".");
			}
		}else{
			for(int i=1;i<pos;i++){
				if(i==2)continue;
				printf("%c",str[i]);
			}
			for(int i=0;i<exp-(pos-3);i++){
				printf("0");
			} 
		}
	} 
	return 0;
}

用語集:

表記表記の
実数実
末尾のドラッグ

PS:

公開された26元の記事 ウォンの賞賛0 ビュー479

おすすめ

転載: blog.csdn.net/PanYiAn9/article/details/102644724