PAT 乙级 1024.科学计数法 C++/Java

题目来源

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。

输入格式:

每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。

输出格式:

对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。

输入样例 1:

+1.23400E-03
 

输出样例 1:

0.00123400
 

输入样例 2:

-1.2E+10
 

输出样例 2:

-12000000000

分析:

给定字符串 str ,

1. 如果 str[0] == '-' ,就输出负号

2. 找到 E 的位置 indexOfE ,将字符串分割成两个部分  beforeE // 不包括符号位  和   num // 指数  

3. 如果指数小于0,先输出 0. ,再输出 num - 1 个0,接着输出 beforeE 中的数字(里面的小数点不输出)

4. 如果指数大于等于0,先输出 beforeE[0] ,即小数点前的一个数字。

  4.1 如果 beforeE 中小数点后的数字长度大于 num ,就将 beforeE 小数点后的 num 个数字输出,接着输出小数点,最后输出剩余的数字

  4.2 如果 beforeE 中小数点后的数字长度等于 num ,就直接输出 beforeE 小数点后的数字

  4.3 如果 beforeE 中小数点后的数字长度小于 num ,就将 beforeE 小数点后的数字输出,最后输出 num - beforeE.size() + 1  个0 (+1是因为字符串把小数点的长度也算进去了)

 

C++实现:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string str;
    cin >> str;
    if (str[0] == '-') {
        cout << '-';
    }
    int indexOfE = 0;
    while (str[indexOfE] != 'E') {
        indexOfE++;
    }
    string beforeE = str.substr(1, indexOfE - 1);    //从下标1开始,截取indexOfE - 1 个字符
    int num = stoi(str.substr(indexOfE + 1));    // 从iindexOfE + 1 到末位的字符串,转int

    if (num < 0) {
        cout << "0.";
        for (int i = 0; i < abs(num) - 1; ++i) {
            cout << 0;
        }
        for (int i = 0; i < beforeE.size(); ++i) {
            if (beforeE[i] != '.') {
                cout << beforeE[i];
            }
        }
    }
    if (num >= 0) {
        cout << beforeE[0];
        int len = beforeE.size() - 2;    // 小数点后的数字长度
        if (len > num) {
            int cnt = 0;
            int i = 0;
            for (i = 2, cnt = 0; i < beforeE.size() && cnt < num; ++i, ++cnt) {
                cout << beforeE[i];
            }
            cout << '.';
            for (int j = i; j < beforeE.size(); ++j) {
                cout << beforeE[j];
            }
        }
        else if (len == num) {
            for (int i = 2; i < beforeE.size(); ++i) {
                cout << beforeE[i];
            }
        }
        else if (len < num) {
            for (int i = 2; i < beforeE.size(); ++i) {
                cout << beforeE[i];
            }
            for (int i = 0; i < num - len; ++i) {
                cout << 0;
            }
        }
    }
    system("pause");
    return 0;
}
View Code

 

 

 

 

Java实现:

posted @ 2020-01-20 14:18  47的菠萝~  阅读(257)  评论(0编辑  收藏  举报