题目链接

特殊的科学计数法

题目描述

将一个给定的正整数 转换为 a.b*10^c 形式的科学记数法。要求 a.b 的值在 范围内,并四舍五入到小数点后一位。

解题思路

本题的核心在于处理大数和实现带进位的四舍五入。由于输入的整数可能非常大,超过标准整型(如 long long)的表示范围,因此最稳妥的方法是将其作为字符串来处理。

算法步骤如下:

  1. 读取输入:将正整数 作为字符串 s 读入。

  2. 计算指数 c:科学记数法的指数由数字的位数决定。如果字符串 s 的长度为 L,则该数可以表示为 s[0].s[1]s[2]... * 10^(L-1)。因此,指数 c 就是 L - 1

  3. 提取基数部分 ab

    • 系数的整数部分 a 总是字符串的第一个字符 s[0]
    • 系数的小数部分 b 由第二个字符 s[1] 决定,但需要考虑第三个字符 s[2] 的影响来进行四舍五入。
  4. 实现四舍五入与进位

    • 我们定义三个变量来存储 ab 和用于判断的第三位数字的整数值。
    • val_a = s[0] - '0'
    • val_b = (L > 1) ? (s[1] - '0') : 0
    • round_digit = (L > 2) ? (s[2] - '0') : 0
    • 如果 round_digit >= 5,则需要对 val_b 进行进位:val_b++
    • 处理向 a 的进位:如果 val_b 进位后等于 10(即原先 val_b9),那么 val_b 应变为 0,同时 val_a 需要加一:val_a++
    • 处理向指数 c 的进位:如果 val_a 在进位后等于 10(即原先 val_a9),那么 val_a 应变为 1,并且指数 c 需要加一。例如,9.95 四舍五入为 10.0,在科学记数法中应表示为 1.0,同时指数加一。
  5. 格式化输出:将最终计算出的 val_a, val_b, 和 c 拼接成 a.b*10^c 的格式输出。

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string s;
    cin >> s;

    int l = s.length();
    int c = l - 1;

    int a = s[0] - '0';
    int b = (l > 1) ? (s[1] - '0') : 0;
    int round_digit = (l > 2) ? (s[2] - '0') : 0;

    if (round_digit >= 5) {
        b++;
    }

    if (b >= 10) {
        b = 0;
        a++;
    }

    if (a >= 10) {
        a = 1;
        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 l = s.length();
        int c = l - 1;

        int a = s.charAt(0) - '0';
        int b = (l > 1) ? (s.charAt(1) - '0') : 0;
        int roundDigit = (l > 2) ? (s.charAt(2) - '0') : 0;

        if (roundDigit >= 5) {
            b++;
        }

        if (b >= 10) {
            b = 0;
            a++;
        }

        if (a >= 10) {
            a = 1;
            c++;
        }

        System.out.println(a + "." + b + "*10^" + c);
    }
}
import sys

def solve():
    s = sys.stdin.readline().strip()
    
    l = len(s)
    c = l - 1
    
    a = int(s[0])
    b = int(s[1]) if l > 1 else 0
    round_digit = int(s[2]) if l > 2 else 0
    
    if round_digit >= 5:
        b += 1
        
    if b >= 10:
        b = 0
        a += 1
        
    if a >= 10:
        a = 1
        c += 1
        
    print(f"{a}.{b}*10^{c}")

solve()

算法及复杂度

  • 算法:字符串处理
  • 时间复杂度:,其中 是输入数字字符串的长度。主要开销在于读取字符串。后续的计算都是常数时间操作。
  • 空间复杂度:,用于存储输入的字符串。