PAT 1024 科学计数法

题目

/*
 1024. 科学计数法 (20)

 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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.234 00 中00 也是有效位?

代码

1、方法一

#include <stdio.h>
#include <string>
#include <iostream>
#include <string.h>

using namespace std;

int main(){
	
//	while(1){
	// 输出符号
	char sign;
	cin >> sign;
	if(sign == '-')cout << sign;
	
	// 得到有效数字串、指数符号、指数
	char num[10005];
	char signE;
	char e[10005];
	scanf("%s",num);
	int len = (int)strlen(num);
	int j = 0;
	int tag = -1;
	for (int i = 0; i < len; ++i) {
		
		if (tag == 1)e[j++] = num[i];
		
		if (tag == 0) {
			signE = num[i];
			tag = 1;
		}
		if (num[i] == 'E') {
			num[i] = 0;
			tag = 0;
		}
	}
	e[j]=0;
	
	
		
//	scanf("%sE%c%s",num,&signE,e);
//	cin.getline(num,10000,'E');
//	cin >> signE;
//	cin.getline(e, 10000);
	string numStr = num;
	int eInt = atoi(e);
	numStr.erase(numStr.begin()+1);
	
	if(signE == '+'){
		if (eInt < numStr.length() - 1) {
			numStr.insert(eInt+1,".");
		}else if (eInt > numStr.length() - 1){
			numStr.append(eInt - numStr.length() + 1 , '0');
		}
//		// 去掉开头多余的0
//		//如果不是字符串开头有零,并且零的后面没有'.'也不是末尾
//		int i = 0;
//		
//		while (i < numStr.length() && numStr[i] == '0') {
//			if (i + 1 == numStr.length() || ((i + 1 != numStr.length()) && numStr[i+1] == '.')) {
//				break;
//			}
//			numStr.erase(numStr.begin());
//		}
	}else{
		if (eInt >= 1) {
			numStr.insert(0, eInt, '0');
		}
		numStr.insert(1, ".");
	}
	cout << numStr << endl;

//	}

}

2、方法二 | 使用正则输入

#include <stdio.h>
#include <string>
#include <iostream>
#include <string.h>

using namespace std;

int main(){
	
	// 输出符号
	char sign;
	cin >> sign;
	if(sign == '-')cout << sign;
	
	// 得到有效数字串、指数符号、指数
	char num[10005];
	char signE;
	char e[10005];
	
	char gewei;
	//	符号、个位、.、小数、E、符号、指数
	scanf("%c.%[0-9]E%c%[0-9]",&gewei,num+1,&signE,e);
	num[0]=gewei;
	
	string numStr = num;
	int eInt = atoi(e);
	
	if(signE == '+'){
		if (eInt < numStr.length() - 1) {
			numStr.insert(eInt+1,".");
		}else if (eInt > numStr.length() - 1){
			numStr.append(eInt - numStr.length() + 1 , '0');
		}

	}else{
		if (eInt >= 1) {
			numStr.insert(0, eInt, '0');
		}
		numStr.insert(1, ".");
	}
	cout << numStr << endl;

	
}
原文地址:https://www.cnblogs.com/tangyikejun/p/4300372.html