1 条题解

  • 0
    @ 2095-4-21 15:49:52

    练35.3 大大大

    解题思路

    字符串读取纯小数,截取小数点后部分,去掉前导零后输出;若全部为0则输出0。相当于不断乘10直到得到整数,避免浮点误差。

    正确性说明

    按上述推导执行:每次仅处理当前输入或当前步骤,并把它对答案的贡献计入对应状态。所有需要处理的情况均被覆盖,结束时保存的量就是题目所求。

    易错点

    不能用浮点while循环判断是否整数,二进制误差可能无法结束;小数末尾的零不必作为整数位保留,因此先删除无意义末尾零。

    复杂度

    输入L位,时间O(L),空间O(L)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        string s;
        cin >> s;
        size_t p = s.find('.');
        string t = p == string::npos ? "0" : s.substr(p + 1);
        while (t.size() > 1 && t.back() == '0')
            t.pop_back();
        p = t.find_first_not_of('0');
        cout << (p == string::npos ? "0" : t.substr(p)) << "\n";
        return 0;
    }
    
    • 1