PAT A1073 Scientific Notation(C++)

PAT甲级目录 | PAT乙级目录

题目描述

原题地址:A1073 Scientific Notation
中文版:B1024 科学计数法

解题思路

对所有情况分类讨论,考虑“指数 $e$ 是否大于零”以及“指数绝对值与有效数字位数 $k$ 大小比较”两个因素,可以分成三类:

  • $e < 0$
    • 在最前面需要补上 |e| 个 0, 在第一个数字之后添加小数点
  • $e \geq 0 ; e \geq k$
    • 在最后补上 $ e - k $ 个 0,不用添加小数点
  • $e \geq 0 ; e < k$
    • 在第 $e + 1$ 个数字后的位置添加小数点

易错点

  • 先组合数字,再想办法在合适的位置插入小数点,比较不容易出错
  • 正数不输出 “+” 号,负数要输出 “-“ 号

也许陌生的知识点

  • ans.insert(<插入位置>, '<插入的字符>');
    • 实现在字符串特定位置插入一个字符
    • 所需头文件: string
  • s.erase(s.begin(), s.begin() + 3);
    • 删除字符串 [first, last) 范围的部分
    • 所需头文件: string

代码示例:

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
#include <iostream>
#include <string>
using namespace std;
int main(){
string s, v_num, ans, temp;
int exp, i = 0;
cin >> s;
if(s[0] == '-') cout << s[0];// 输出负号
v_num += s[1];
s.erase(s.begin(), s.begin() + 3);//去除小数点及其前面的字符
while(s[0] != 'E'){
v_num += s[0];
s.erase(s.begin());
}
s.erase(s.begin());
exp = stoi(s);
if(exp < 0){//指数小于零
while(i++ < -exp) temp += '0';
ans = temp + v_num;
ans.insert(ans.begin() + 1, '.');
}else{//指数大于等于零
if(exp >= v_num.length() - 1){//指数比小数的有效数字位数大
while(i++ < exp - v_num.length() + 1) temp += '0';
ans = v_num + temp;
}else{//指数比小数部分的有效数字小
ans = v_num;
ans.insert(ans.begin() + exp + 1, '.');
}
}
cout << ans << endl;
return 0;
}