zoukankan      html  css  js  c++  java
  • 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/

    欢迎讨论和交流!


  • 相关阅读:
    linux命令大全
    IP协议
    TCP、IP、ARP协议之间的工作关系
    程序出现问题后
    HTTP(超文本传输协议)
    多线程
    syslog.conf文件
    logger命令
    gdb
    二、数据的存储结构
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/11311999.html
Copyright © 2011-2022 走看看