一、题目
二、代码
输入用string,中间进行数字int和字符串string的转换,stoi。
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int main() {
string s;
cin >> s;
if (s[0] == '-') {
cout << "-";
}
//得到E后的指数大小
int e = s.find('E') ;
int eh = s.length() - e -1;//E后数组可能不止两位
string after = s.substr(e + 1, eh);
int eaft = stoi(after);
//得到小数点后的数字
string before = s.substr(3, e - 3);
int ebef = stoi(before);
//输出,E后为正后补0
if (eaft > 0) {
cout << s[1];
if (before.length() <= eaft) {
cout << before;
for (int i = before.length(); i < eaft; i++) {
cout << "0";
}
}
else {
for (int i = 3; i < e; i++) {
if (i == eaft + 3){
cout<<'.';
}
cout << s[i];
}
}
}//E为0,直接输出
else if (eaft == 0) {
cout << s[1] << "." << before;
}
//E后为负前补0
else {
for (int i = 0; i < (-eaft); i++) {
if (i == 1) {
cout << ".";
}
cout << '0';
}
cout << s[1] << before;
}
}
三、分析
注意测试:
+9.0E+0
+9.0E+1
+1.23456E+2
+1.23456E+555
1.读题分析:
拆分成三部分:正负号,数字(注意输出末尾可有0)和E后的指数部分
正则表达式!!!
符号 | 含义 |
+ | 匹配前面的子表达式一次或多次。 例如,“ |
[] | 字符范围。匹配指定范围内的任意字符。 例如,“ |
2.通过判断E的正负进行补0(测试点1.2.3)
E | 0 |
+ | 后补0(不是直接加,循环起始要减去before的个数) |
0 | 需要单独判断,直接输出n.nnn |
- | 前补0 |
E为+:
例:
3.测试点4
目前对E为正的思路,是直接补0,但是忽略了E的0不够是的情况。
即+1.23456789E+03
正确结果为1234.56789
输出结果为
加判断:
if (eaft > 0) {
cout << s[1];
if (before.length() <= eaft) {
cout << before;
for (int i = ebef - 1; i < eaft; i++) {
cout << "0";
}
}
else {
for (int i = 3; i < e; i++) {
if (i == eaft + 3){
cout<<'.';
}
cout << s[i];
}
}
}
4.测试点5
E后可以是多位eg:E+2131,E-598;指数的绝对值不超过 9999
所以要计算指数的大小.
//得到E后的指数大小
int e = s.find('E') ;
int eh = s.length() - e -1;//E后数组可能不止两位
string after = s.substr(e + 1, eh);
int eaft = stoi(after);