题解:CF691C Exponential notation

题目链接

中文版题面 - 由洛谷(中国大陆)提供

英文版题面 - 由CodeForces官网提供

思路

很简单的模拟题。

这道模拟题有一个难点就是如何将一个不符合规范的数转换成符合规范的数。

首先就是去除多余的零,这里我们只需要通过两遍循环,记录一下符合规范的数在给定的字符串中实际的头尾 l l l r r r

l = -1;
for (int i = 0; i < s.size(); i++) {
    if (s[i] != '0' && s[i] !='.') {
        l = i;
        break;
    }
}
for (int i = s.size() - 1; i> -1; i--) {
    if (s[i] != '0' && s[i] != '.') {
        r = i;
        break;
    }
}

然后直接用自带的函数找到小数点的位置。

s.find('.');

难点解决了。

接下来就是将一个字符串转换成科学计数法规范下的数。

实际上这个过程并不算难,按照数学转换的模拟即可。

if (l == -1) {
    cout << 0;
    return 0;
}
if (l == r) {
    cout << s[l];
}
if (l != r) {
    cout <<s[l]<< ".";
    for (int i = l + 1; i <= r; ++i)
        if (s[i] != '.')
            cout << s[i];
}
if (l + 1 != xsd) cout << "E" << xsd - l - (l < xsd);

完整代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    cin >> s;
    int l, r;
    l = -1;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] != '0' && s[i] !='.') {
            l = i;
            break;
        }
    }
    for (int i = s.size() - 1; i> -1; i--) {
        if (s[i] != '0' && s[i] != '.') {
            r = i;
            break;
        }
    }
    int xsd = s.find('.');
    if (xsd == -1) {
        xsd = s.size();
    }
    if (l == -1) {
        cout << 0;
        return 0;
    }
    if (l == r) {
        cout << s[l];
    }
    if (l != r) {
        cout <<s[l]<< ".";
        for (int i = l + 1; i <= r; ++i)
            if (s[i] != '.')
            cout << s[i];
    }
    if (l + 1 != xsd) cout << "E" << xsd - l - (l < xsd);
    return 0;
}

提醒

本题需要开启C++14,否则部分系统自带函数会报错。

C++14命令为 -std=c++14,可在编译器中设置。

可在 CodeForces官网 上提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值