我的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-ADVANCED1073:
知识点:字符串
思路:考虑全面所有情况
本题较难,因为考虑的情况有点多。
(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++解题报告: