特殊的科学计数法

[题目链接](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();
});

复杂度分析

  • 时间复杂度:。只需要读取字符串的前三个字符做判断,与输入长度无关。
  • 空间复杂度:,其中 是输入字符串的长度(存储输入本身)。如果不计输入存储,则为