pat乙级 科学计数法

转载自柳婼的个人博客 我添上了解释

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;
int main() {

    freopen("Text1.txt", "r", stdin);
    string s;
    cin >> s;
    int i = 0;
    while (s[i] != 'E') i++;
    string t = s.substr(1, i - 1);
    int n = stoi(s.substr(i + 1));
    if (s[0] == '-') cout << "-";//数字的正负由第一个字符决定,是负数就输出负号,不是就不输出。
    if (n < 0) {// 指数小于零则左移小数点,因此一定会先出现 0. 先把0.输出,然后根据左移动的数位确定小数点后的零的数目。
        cout << "0.";
        for (int j = 0; j < abs(n) - 1; j++) cout << '0';//输出小数点后零的数目
        for (int j = 0; j < t.length(); j++)//输出有效数字。
            if (t[j] != '.') cout << t[j];
    }
    else {/*当指数大于零  即小数点需右移时,需要判断右移的长度即变量n是否长于有效数字的长度,
            如果比有效数字长,需要补上零。*/
        cout << t[0];//如果指数不小于零,那么小数点一定在第一个数字之后,所以先输出第一个数字。
        int cnt, j;
        for (j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++) cout << t[j]; /*cnt 是已经输出的右移的数位,如果它不比n小说明右移
已经结束。或者cnt仍然比n小,但是因为j不小于t.length而结束了循环,说明需要在后面补零。
后面的if else 就是为了判断到底是哪一种情况结束了循环
*/
        if (j == t.length()) {  
            for (int k = 0; k < n - cnt; k++) cout << '0';
        }
        else {
            cout << '.';//如果j比t.length小,则右移的长度小于有效数字的长度,此时输出小数点,并将有效数字中剩下的部分输出。
            for (int k = j; k < t.length(); k++) cout << t[k];
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wi8ruk48/article/details/82143857