题目链接
https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
题解
第一遍也是没有全部AC,有3个测试点没过,原因如下:
- 没有处理指数为0的情况
- 指数为正时,没有处理不需补充0而需插入小数点的情况。(经过https://blog.csdn.net/whenever5225/article/details/90454014提示才知道的)
修改后全部都AC了。
整体的思路是获取整数和小数数值部分,然后获取指数,最后进行小数点的移动。
// 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/
欢迎讨论和交流!