题目链接

BGN12 特殊的科学计数法

题目描述

给定一个正整数 (位数可达1000),请将其转写为科学计数法形式,形如:。 具体而言,有如下要求:

  • 之间的整数;
  • 为对 的第二位数字进行四舍五入后的小数部分(保留一位小数);
  • 为整数指数;
  • 输出格式严格为 a.b*10^e,无多余空格。

输入描述

一行输入正整数 ,不含前导零。

输出描述

输出 的科学计数法表示 a.b*10^e

样例1

输入

299792458

输出

3.0*10^8

样例2

输入

602214129000000000000000

输出

6.0*10^23

解题思路

由于给定的正整数 的位数可能非常长,我们需要将其作为字符串来处理。

科学记数法的一般形式为

  • 指数 的值等于原数字字符串 的长度减一。
  • 是通过对 的有效数字部分进行四舍五入得到的,需要保留一位小数。标准的四舍五入规则是看小数点后的第二位,即原始数字的第三位

具体步骤如下:

  1. 以字符串形式读入数字
  2. 指数 的值为
  3. 的值为 的第一位数字
  4. 的初始值为 的第二位数字 (如果存在)。
  5. 检查 的第三位数字 (如果存在)。如果 大于等于 '5',则对 进行进位。
  6. 如果 进位后变为 10,则将 置为 0,并对 进行进位。
  7. 如果 进位后变为 10(例如原数是 "999..."),则将 置为 1,并将指数 加 1。
  8. 最后,按照 a.b*10^e 的格式进行输出。

代码

#include <iostream>
#include <string>

using namespace std;

int main() {
    string s;
    cin >> s;

    // 指数是长度减一
    int e = s.length() - 1;

    // a 是第一位数字
    int a = s[0] - '0';
    
    // b 是第二位数字,如果不存在则为0
    int b = 0;
    if (s.length() > 1) {
        b = s[1] - '0';
    }

    // 根据第三位数字决定是否四舍五入
    if (s.length() > 2) {
        if (s[2] >= '5') {
            b++;
        }
    }

    // 处理 b 的进位
    if (b == 10) {
        b = 0;
        a++;
    }

    // 处理 a 的进位
    if (a == 10) {
        a = 1;
        e++;
    }

    // 输出结果
    cout << a << "." << b << "*10^" << e << '\n';

    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 e = s.length() - 1;

        // a 是第一位数字
        int a = s.charAt(0) - '0';
        
        // b 是第二位数字,如果不存在则为0
        int b = 0;
        if (s.length() > 1) {
            b = s.charAt(1) - '0';
        }

        // 根据第三位数字决定是否四舍五入
        if (s.length() > 2) {
            if (s.charAt(2) >= '5') {
                b++;
            }
        }

        // 处理 b 的进位
        if (b == 10) {
            b = 0;
            a++;
        }

        // 处理 a 的进位
        if (a == 10) {
            a = 1;
            e++;
        }

        // 输出结果
        System.out.println(a + "." + b + "*10^" + e);
    }
}
# -*- coding: utf-8 -*-

s = input()

# 指数是长度减一
e = len(s) - 1

# a 是第一位数字
a = int(s[0])

# b 是第二位数字,如果不存在则为0
b = 0
if len(s) > 1:
    b = int(s[1])

# 根据第三位数字决定是否四舍五入
if len(s) > 2:
    if s[2] >= '5':
        b += 1

# 处理 b 的进位
if b == 10:
    b = 0
    a += 1

# 处理 a 的进位
if a == 10:
    a = 1
    e += 1

# 输出结果
print(f"{a}.{b}*10^{e}")

算法及复杂度

  • 算法:字符串处理、模拟
  • 时间复杂度:,其中 是输入数字字符串 的长度。
  • 空间复杂度:,用于存储输入的字符串