特殊的科学计数法
[题目链接](https://www.nowcoder.com/practice/40b3b62cfa2d4a28b328a31efe377dad)
思路
题目要求把一个正整数转换成 a.b*10^c 的形式,其中 ,
是一位数字,且
需要四舍五入到小数点后一位。
先想想 是多少。如果输入的数字有
位,那科学计数法的指数就是
。比如
299792458 有 9 位,所以 。
再看 和
。
就是数字的第一位,
就是第二位——但别忘了还要四舍五入。四舍五入看的是哪一位?是第三位(也就是
中的
那一位)。如果第三位
,就要把
加一。
加一之后会不会进位?会的。如果 从 9 变成了 10,就要向
进位:
变 0,
加一。极端情况下
也可能从 9 变成 10(比如输入
995),这时候结果应该是 1.010^3 而不是 10.010^2,所以还要把 重设为 1、
重设为 0、
加一。
如果输入只有 1 位, 就是 0,不需要四舍五入;只有 2 位时,没有第三位来决定是否进位,同样直接输出。
整个过程只需要看输入字符串的前三个字符,非常简洁。
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.size();
int c = n - 1;
int a = s[0] - '0';
int b = n >= 2 ? s[1] - '0' : 0;
if (n >= 3 && s[2] - '0' >= 5) {
b++;
if (b == 10) {
b = 0;
a++;
if (a == 10) {
a = 1;
b = 0;
c++;
}
}
}
cout << a << "." << b << "*10^" << c << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int n = s.length();
int c = n - 1;
int a = s.charAt(0) - '0';
int b = n >= 2 ? s.charAt(1) - '0' : 0;
if (n >= 3 && s.charAt(2) - '0' >= 5) {
b++;
if (b == 10) {
b = 0;
a++;
if (a == 10) {
a = 1;
b = 0;
c++;
}
}
}
System.out.println(a + "." + b + "*10^" + c);
}
}
s = input().strip()
n = len(s)
c = n - 1
a = int(s[0])
b = int(s[1]) if n >= 2 else 0
if n >= 3 and int(s[2]) >= 5:
b += 1
if b == 10:
b = 0
a += 1
if a == 10:
a = 1
b = 0
c += 1
print(f"{a}.{b}*10^{c}")
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (line) => {
const s = line.trim();
const n = s.length;
let c = n - 1;
let a = parseInt(s[0]);
let b = n >= 2 ? parseInt(s[1]) : 0;
if (n >= 3 && parseInt(s[2]) >= 5) {
b++;
if (b === 10) {
b = 0;
a++;
if (a === 10) {
a = 1;
b = 0;
c++;
}
}
}
console.log(`${a}.${b}*10^${c}`);
rl.close();
});
复杂度分析
- 时间复杂度:
。只需要读取字符串的前三个字符做判断,与输入长度无关。
- 空间复杂度:
,其中
是输入字符串的长度(存储输入本身)。如果不计输入存储,则为
。

京公网安备 11010502036488号