18206 敲代码还是看球赛?

### 分析

1. **问题描述**:
   - 给定若干个科学记数法格式的实数,将其转换为普通的十进制格式。
   - 如果转换后的数是整数,则不显示小数部分和小数点。

2. **解决方案**:
   - 解析输入的科学记数法格式字符串`A.BeD`,其中`A`是整数部分,`B`是小数部分,`D`是指数部分。
   - 根据指数`D`,将小数部分`B`移动相应的位置,形成普通的十进制数。
   - 如果结果是整数,则不显示小数部分和小数点。

### 伪代码

1. 读取输入的测试数据数量`T`。
2. 对于每组测试数据,解析字符串`A.BeD`。
3. 根据指数`D`,调整小数点的位置,形成普通的十进制数。
4. 输出结果,如果是整数,则不显示小数部分和小数点。

### C++代码

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

string scientificToDecimal(const string& sci) {
    size_t ePos = sci.find('e');
    string base = sci.substr(0, ePos);
    int exponent = stoi(sci.substr(ePos + 1));

    size_t dotPos = base.find('.');
    string integerPart = base.substr(0, dotPos);
    string fractionalPart = base.substr(dotPos + 1);

    if (exponent >= 0) {
        if (exponent < fractionalPart.size()) {
            integerPart += fractionalPart.substr(0, exponent);
            fractionalPart = fractionalPart.substr(exponent);
        } else {
            integerPart += fractionalPart;
            integerPart.append(exponent - fractionalPart.size(), '0');
            fractionalPart = "";
        }
    } else {
        if (-exponent < integerPart.size()) {
            fractionalPart = integerPart.substr(integerPart.size() + exponent) + fractionalPart;
            integerPart = integerPart.substr(0, integerPart.size() + exponent);
        } else {
            fractionalPart = string(-exponent - integerPart.size(), '0') + integerPart + fractionalPart;
            integerPart = "0";
        }
    }

    if (fractionalPart.empty()) {
        return integerPart;
    } else {
        while (!fractionalPart.empty() && fractionalPart.back() == '0') {
            fractionalPart.pop_back();
        }
        return integerPart + (fractionalPart.empty() ? "" : "." + fractionalPart);
    }
}

int main() {
    int T;
    cin >> T;
    cin.ignore();
    while (T--) {
        string sci;
        getline(cin, sci);
        cout << scientificToDecimal(sci) << endl;
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值