PAT-BASIC1024——科学计数法/PAT-ADVANCED1073——Scientific Notation

我的PAT-BASIC代码仓:https://github.com/617076674/PAT-BASIC

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:

PAT-BASIC1024:https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168

PAT-ADVANCED1073:https://pintia.cn/problem-sets/994805342720868352/problems/994805395707510784

题目描述:

PAT-BASIC1024:

PAT-BASIC1024——科学计数法/PAT-ADVANCED1073——Scientific Notation

PAT-ADVANCED1073:

PAT-BASIC1024——科学计数法/PAT-ADVANCED1073——Scientific Notation

知识点:字符串

思路:考虑全面所有情况

本题较难,因为考虑的情况有点多。

(1)对于数字开头的正负号,正号舍去,负号保留。

(2)根据E后面的是正号还是负号做不同的分类处理。

a:如果E后面的是正号,还要判断E后面的值与小数点之后、E之前的位数的大小关系。

a-1:如果E后面的值大于等于小数点之后、E之前的位数,则需要去除小数点,在数字后面补“0”。

a-2:如果E后面的值小于小数点之后、E之前的位数,则需要移动小数点的位置,不需要再数字后面补“0”。

b:如果E后面的是负号,则根据E后面的值输出数字前方0的个数,需要注意的是不管有多少个0,第一个0之后的第一个字符一定是一个小数点。

幸好本题限定了整数部分不为0,否则情况将更加复杂。

时间复杂度是O(n),其中n为输入字符串的长度。空间复杂度是O(1)。

C++代码:

#include<iostream>
#include<string>

using namespace std;

int main() {
		string input;

		cin >> input;

		int flag = 0;
		int indexE = 0;
		for (int i = 0; i < input.length(); i++) {
			if (input[i] == 'E') {
				indexE = i;
				if (input[i + 1] == '+') {
					flag = 1;
				} else if (input[i + 1] == '-') {
					flag = 0;
				}
				break;
			}
		}

		int expr = 0;
		for (int i = indexE + 2; i < input.length(); i++) {
			expr = expr * 10 + input[i] - '0';
		}
		if (expr == 0) {
			for (int i = 0; i < indexE; i++) {
				if (input[i] == '+') {
					continue;
				}
				cout << input[i];
			}
			return 0;
		}

		if (flag) {
			if (expr >= indexE - 3) {
				for (int i = 0; i < indexE; i++) {
					if (input[i] == '.' || input[i] == '+') {
						continue;
					}
					cout << input[i];
				}
				for (int i = 0; i < expr - indexE + 3; i++) {
					cout << "0";
				}
			} else {
				for (int i = 0; i <= 2 + expr; i++) {
					if (input[i] == '.' || input[i] == '+') {
						continue;
					}
					cout << input[i];
				}
				cout << ".";
				for (int i = 3 + expr; i < indexE; i++) {
					cout << input[i];
				}
			}
		} else {
			if (input[0] == '-') {
				cout << "-";
			}
			for (int i = 0; i <= expr; i++) {
				if (i == 1) {
					cout << ".";
				} else {
					cout << "0";
				}
			}
			for (int i = 1; i < indexE; i++) {
				if (input[i] == '.') {
					continue;
				}
				cout << input[i];
			}
		}
}

C++解题报告:

PAT-BASIC1024——科学计数法/PAT-ADVANCED1073——Scientific Notation