题目描述

本题是高精度字符串处理的题,难度简单

给定一个正整数 (位数可达 ),请将其转写为科学计数法形式:

要求:

  • 为整数;
  • 是对 的第二位数字四舍五入后保留的一位小数
  • 为整数指数;
  • 输出格式严格为:a.b*10^c(无空格)。

输入保证 ,即 至少有 3 位,且无前导零。

核心思路

核心观察

  • 科学计数法只需关注 前三位数字总位数
  • 四舍五入仅由第三位数字决定:若 ,则第二位加 1。
  • 利用整数除法 (s[2]-'0')/5巧妙实现四舍五入标志(0 或 1),无需分支判断。
  • 进位最多发生一次:例如 9959.95 → 四舍五入为 10.0,需修正为 1.0*10^3
  • 题目保证 ,可安全访问 s[0], s[1], s[2]

算法步骤

  1. 读入字符串 s
  2. 计算 x = (s[0]-'0')*10 + (s[1]-'0') + (s[2]-'0')/5,其中 /5 实现四舍五入进位。
  3. 分离整数部分 a = x / 10 和小数部分 b = x % 10
  4. 初始指数 c = s.size() - 1
  5. a == 10(如 995 情况),修正为 a=1, b=0, c++
  6. 按格式输出结果。

正确性分析

  • (s[2]-'0')/5 在整数除法下精确等价于 s[2] >= '5' ? 1 : 0,确保四舍五入正确。
  • 所有可能进位情形(仅 a=10)被显式处理,保证 a ∈ [1,9]
  • 指数 c 在进位时加 1,符合科学计数法规则(如 995 ≈ 1.0×10^3)。
  • 输入约束确保不会越界访问字符串。

复杂度分析

  • 时间复杂度
    • 仅访问字符串前 3 个字符并进行常数次算术运算,与输入长度无关。
  • 空间复杂度
    • 仅使用固定数量的整型变量,不依赖输入规模。

代码

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

int main() {
    string s; cin >> s;
    
    int x = (s[0]-'0')*10 + (s[1]-'0') + (s[2]-'0')/5;
    int a = x / 10, b = x % 10, c = s.size() - 1;//整数,小数,位数
    if (a == 10) a = 1, b = 0, c++;//特判修正
    cout << a << '.' << b << "*10^" << c;
}