科学记数法(20分)

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

思路:

首先打出符号位

分为当指数为正数和为负数的情况:正数时又有末尾加0和不加0的情况:

   为正数时:首先打出第一位整数部分,当末尾无需加0时:首先打出a(指数的值)位数字,打出小数点,打出剩余数字

                                                                 当末尾需要加0时:打出所有的数字,在打出a-(size()-3)个0.

   为负数时:先打出‘0.’;然后打出a-1个0;把输入的所有数字打印出来(注意保留最后的0)

#include<iostream>
#include<vector>
#include<string>

using namespace std;
int main() {
    vector<char> tmp;
    vector<char> tmp1;
    int a = 0;
    double b = 0;
    string str;
    int i,q,p=0;

    getline(cin, str);

    for (i = 0; i < str.size(); i++) {
        if (str[i] != 'E') {
            tmp.push_back(str[i]);
        }
        else break;
    }//系数压入

    for (q = i + 1; q < str.size(); q++) {
        tmp1.push_back(str[q]);
    }//指数压入
    
    if (tmp[0] == '-')cout << tmp[0];//输出符号位

    for (int j = 1; j < tmp1.size(); j++) {
        a = 10 * a + (tmp1[j] - '0');
    }//指数的值

    if (tmp1[0] == '+') {
        cout << tmp[1] - '0';
        if (a >=  i - 3) {
            for (int n = 3; n < tmp.size(); n++) cout << tmp[n] - '0';
            for (int n = 0; n < a-i+3; n++) cout << '0';
        }
        else {
            int n;
            for ( n = 3; n < a+3; n++) cout<< tmp[n] - '0';
            cout << ".";
            for ( n = n; n < tmp.size(); n++) cout << tmp[n] - '0';
        }
    }//指数大于0的情况
    else {
        cout << "0.";
        for (int n = 0; n < a - 1; n++) cout << '0';
        cout << tmp[1] - '0';
        for (int n = 3; n < i; n++) cout << tmp[n] - '0';
    }//指数小于0的情况
}


 

猜你喜欢

转载自blog.csdn.net/qq_42082542/article/details/84405225