PAT乙级1024

题目链接

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

题解

第一遍也是没有全部AC,有3个测试点没过,原因如下:

  1. 没有处理指数为0的情况
  2. 指数为正时,没有处理不需补充0而需插入小数点的情况。(经过https://blog.csdn.net/whenever5225/article/details/90454014提示才知道的)

修改后全部都AC了。

整体的思路是获取整数和小数数值部分,然后获取指数,最后进行小数点的移动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// PAT BasicLevel 1024
// https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168

#include <iostream>
#include <string>
using namespace std;

int getExponent(string);
int main()
{
// 原始字符串和结果
string str,result;
cin >> str;

// 获取结果的符号
string flag = (str[0] == '-' ? "-" : "");

// E在原始字符串中的下标
int eIndex = str.find_last_of('E');

// 获得指数的值
int exponent = getExponent(str.substr(eIndex + 1, str.length()));

// 从原始字符串获取整数和小数部分的数值,现在小数点在result中的下标为1
result = str[1]+str.substr(3, eIndex-3);

// 根据指数进行小数点的移动
if(exponent>0){
// 判断是否需要补充0
int numOfZero = exponent - (result.length() - 1);

// 在尾部补充0
if(numOfZero>=0){
for (int i = 0; i < numOfZero; i++){
result += '0';
}
}
// 不需补充0,而是需要插入小数点
else{
result.insert(result.begin()+exponent+1,'.');
}

}else if(exponent<0){
// 在首部补充0(for循环少补了一个0,这个少补的0在添加小数点时补上)
exponent*=-1;
for(int i=0;i<exponent-1;i++){
result.insert(result.begin(),'0');
}

// 添加小数点
result="0."+result;
}else{
// 添加小数点
result.insert(result.begin()+1,'.');
}


// 输出结果
cout << flag+result;

//system("pause");
return 0;
}

int getExponent(string str)
{
int flag=str[0]=='+'?1:-1;
int num=0;
for(int i=1;i<str.length();++i){
num=num*10+str[i]-'0';
}
return flag*num;
}

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!