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了。

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

// 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/

欢迎讨论和交流!


原文地址:https://www.cnblogs.com/chouxianyu/p/11311999.html