关于算法-数据结构:PAT甲级1073-Scientific-Notation

36次阅读

共计 1776 个字符,预计需要花费 5 分钟才能阅读完成。

题目粗心:

对于给定一个迷信计数法模式的数字,要求将其批改为一般数字示意的模式,并且要求将其无效位都保留。

算法思路:

因为指数局部的绝对值不超过 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″

提交后果:
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;
}

正文完
 0