题目描述
本题是高精度字符串处理的题,难度简单
给定一个正整数 (位数可达
),请将其转写为科学计数法形式:
要求:
为整数;
是对
的第二位数字四舍五入后保留的一位小数;
为整数指数;
- 输出格式严格为:
a.b*10^c(无空格)。
输入保证 ,即
至少有 3 位,且无前导零。
核心思路
核心观察
- 科学计数法只需关注 前三位数字 和 总位数。
- 四舍五入仅由第三位数字决定:若
,则第二位加 1。
- 利用整数除法
(s[2]-'0')/5可巧妙实现四舍五入标志(0 或 1),无需分支判断。 - 进位最多发生一次:例如
995→9.95→ 四舍五入为10.0,需修正为1.0*10^3。 - 题目保证
,可安全访问
s[0],s[1],s[2]。
算法步骤
- 读入字符串
s。 - 计算
x = (s[0]-'0')*10 + (s[1]-'0') + (s[2]-'0')/5,其中/5实现四舍五入进位。 - 分离整数部分
a = x / 10和小数部分b = x % 10。 - 初始指数
c = s.size() - 1。 - 若
a == 10(如995情况),修正为a=1, b=0, c++。 - 按格式输出结果。
正确性分析
(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;
}

京公网安备 11010502036488号