当前位置: 首页 > news >正文

AcWing 5972. 科学记数法

问题描述

在科学记数法中,一个数被写成一个实数 A 与一个 10 的 B 次幂的积:

A × 10^B

在计算机中,上述式子一般表示为 A e B

给定一个实数 x 的科学记数法在计算机中的表示 a.deb,其各个部分满足:

  • 0 ≤ a ≤ 9
  • d 可以包含前导 0;
  • d 可以为 0,但除此之外,不含多余末尾 0;
  • d 的长度不超过 100;
  • b 为非负整数;

请你将实数 x 还原为通常的十进制表示法后输出。


输入格式

输入一个形如 a.deb 的字符串,表示给定实数的科学记数法在计算机中的表示。


输出格式

输出通常的十进制表示法下的 x,输出时:

  • 如果 x 为整数,则输出其整数值,不要带小数部分和小数点,也不要带前导 0。
  • 否则,以 p.q 的形式输出 x,其中 p 作为整数部分不应包含前导 0(但可能等于 0),q 作为小数部分不应包含多余末尾 0(也不应等于 0)。

数据范围

  • 前 5 个测试点满足 d 的长度不超过 3,0 ≤ b ≤ 3
  • 所有测试点满足:
    • 0 ≤ a ≤ 9
    • d 的长度范围 [1, 100]
    • 0 ≤ b ≤ 100
    • a 为 0 时,b 一定为 0。

输入样例 1

1.234e2

输出样例 1

123.4

输入样例 2

1.234e3

输出样例 2

1234

输入样例 3

0.44e0

输出样例 3

0.44

c++代码

#include<bits/stdc++.h>
#include<string.h>

using namespace std;

string str, A, C = "1", mid;
int B;

string high_precision_multiplication(string a, string b) {
    int m = a.size(), n = b.size(), k = m + n;
    vector<int> aa(m, 0), bb(n, 0), cc(m + n, 0);
    for (int i = 0; i < m; i++) aa[m - i - 1] = a[i] - '0';
    for (int i = 0; i < n; i++) bb[n - i - 1] = b[i] - '0';
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cc[i + j] += aa[i] * bb[j];
            cc[i + j + 1] += cc[i + j] / 10;
            cc[i + j] %= 10;
        }
    }
    while(cc[k - 1] == 0) k--;
    string c;
    for (int i = k - 1; i >= 0; i--) c += to_string(cc[i]);
    return c;
}

int main() {
    cin >> str;
    int k = str.find("e"), cont = 0;
    A = str.substr(0, k), B = stoi(str.substr(k + 1));
    for (int i = 0; i < A.size(); i++) {
        if (A[i] == '.') continue;
        if (A[i] == '0') {
            cont++;
            if (i == A.size() - 1) {
                cout << 0;
                return 0;
            }
        }
        else break;
    }
    if (cont != 0 && B <= cont) {
        cont -= B;
        if (cont == 0) {
            cout << A.substr(A.find(".") + 1);
            return 0;
        }
        string ans;
        ans += "0.";
        cont--;
        while(cont--) ans += "0";
        ans += A.substr(A.find(".") + 1);
        cout << ans;
        return 0;
    }
    else if (cont != 0){
        B -= cont;
        A = A.substr(A.find(".") + 1);
        A.insert(1, ".");
    }
    while(B--) C = high_precision_multiplication(C, "10");
    k = A.size() - (A.find(".") + 1);
    for (int i = 0; i < A.size(); i++) {
        if (A[i] != '.') mid += A[i];
    }
    mid = high_precision_multiplication(mid, C);
    string int_part = mid.substr(0, mid.size() - k), decimal_part = mid.substr(mid.size() - k);
    while(decimal_part.size() > 0 && decimal_part.back() == '0') decimal_part.erase(decimal_part.size() - 1);
    string ans = int_part;
    if (decimal_part.size() > 0) ans += "." + decimal_part;
    cout << ans;
    return 0;
}//by wqs

相关文章:

  • 【游戏安全】强制交互类风险
  • Magnet 库的技术架构与核心机制解析
  • Docker部署SpringBoot项目(完整版)
  • 重载“<<”操作符
  • 基于多通道降压稳压器的机器人关节供电系统设计
  • 人工智能day03
  • 设计模式总章
  • UE5 添加随机弹道
  • 【linux知识】web服务环境搭建(一):用户以及开发环境初始化
  • 有一个服务器能做什么?
  • 程序化广告行业(82/89):解锁行业术语,开启专业交流之门
  • 格瑞普Tattu正式成为2025年中国无人机竞速联赛官方赞助商!
  • 【家政平台开发(42)】筑牢家政平台安全防线:安全测试与漏洞修复指南
  • 【ROS】分布式通信架构
  • 文件包含(CTFshow 刷题记录)持续更新
  • 【漏洞复现】Vite 任意文件读取漏洞 CVE-2025-30208/CVE-2025-31125/CVE-2025-31486/CVE-2025-32395
  • scikit-learn 开源框架在机器学习中的应用
  • vue入门:计算属性computer监听器watch
  • 智慧农业整体解决方案
  • AF3 ProteinDataset类的__getitem__方法解读
  • 马上评|中学生被操场地面烫伤,谁的“大课间”?
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 联合国第二届运动会闭幕,刘国梁受邀成为“联合国运动会大使”
  • 浙能集团原董事长童亚辉被查,还是杭州市书法家协会主席
  • 前四个月社会融资规模增量累计为16.34万亿元,比上年同期多3.61万亿元
  • 气候多米诺:厄尔尼诺与东南亚跨境害虫或威胁中国粮食安全