2
题目大意:

对于给定一个科学计数法形式的数字,要求将其修改为普通数字表示的形式,并且要求将其有效位都保留。

算法思路:

由于指数部分的绝对值不超过9999,说明使用double无法存储该数字了,只能使用字符串或者字符数组,这里采用字符串的方式进行处理,科学计数法的数字可以分为有效部分加上指数部分,其分割线为字符E。我们使用indexOfE保存其E字符的位置,subString保存有效部分的绝对值,接下来就是根据指数的正负来判断是小数点往左还是往右移动了,我们使用sgn_expo保存指数的正负,true为正,使用expo保存指数的绝对值,最后对于其输出结果使用result保存,初始为保存该数字的符号。result的获取方法如下:

1、指数为负数,小数点向左移动,也就是在左侧添加expo个0。

首先添加"0.",然后再添加expo-1个0,最后再添加subString去除小数点的部分。
比如+1.23400E-03获得result的方法为,""->"0."->"0.000"->"0.000123400".

2、指数为正数,小数点向右移动,该情况分为2种。
我们使用rest_len表示有效部分中小数点后的部分长度

2.1、如果rest_len>expo,说明小数点向右移动后,依然存在(小数点在expo位置),那么就先添加有效部分的第一位subString[0],再从小数点后面添加expo位字符subString.substr(2,expo) ,接着就是添加小数点,最后添加剩下来的有效部分subString.substr(2+expo)
比如:-1.23E+1获得result的方法:"-"->"-1"->"-12"->"-12."->"-12.3"。

2.2、如果rest_len<expo,说明小数点向右移动后,就不存在小数点了,那么就将有效部分的小数点去掉,赋值给result后,再添加expo-rest_len个0就好。
比如:-1.2E+10获得result的方法为:"-"->"-12"->"-12000000000"

提交结果:截屏2020-10-09 下午2.06.47.png
AC代码:
#include<cstdio>
#include<string>
#include <iostream>

using namespace std;

int main(){
    string s;
    cin>>s;
    bool isPositive = s[0]=='+';//记录该数字的正负
    //找到E的位置
    int indexOfE;
    for(indexOfE=1;indexOfE<s.size();++indexOfE){
        if(s[indexOfE]=='E') break;
    }
    //截取1到indexOfE之间的字符串
    string subString = s.substr(1,indexOfE-1);
    // 获取指数的符号和大小
    bool sgn_expo = s[indexOfE+1]=='+';//true代表为正
    int expo = stoi(s.substr(indexOfE+2));// 指数的绝对值
    string result = isPositive?"":"-";//结果字符串
    // 根据指数的符号判断小数点向左移动还是向右移动
    if(!sgn_expo){
        //指数为负数,小数点向左移动
        result += "0.";
        //添加expo-1个0
        for (int i = 0; i < expo - 1; ++i) {
            result += "0";
        }
        //然后添加subString去除小数点的部分
        result += subString[0]+subString.substr(2);
    } else{
        // 指数为正数,小数点向右移动
        int rest_len = subString.length()-2;//小数点后的部分长度
        if(rest_len>expo){
            //小数点依然存在
            result += subString[0]+subString.substr(2,expo)+"."+subString.substr(2+expo);
        } else{
            //小数点不存在,在后面补充expo-rest_len个0
            result += subString[0]+subString.substr(2);
            for (int i = 0; i < expo-rest_len; ++i) {
                result += "0";
            }
        }
    }
    cout<<result;
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得