码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-20 14:56:25      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:splay   数字   包含   hit   lse   clip   输入   --   namespace   

题目来源

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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[j]; ++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实现:

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

标签:splay   数字   包含   hit   lse   clip   输入   --   namespace   

原文地址:https://www.cnblogs.com/47Pineapple/p/12217774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!