题目链接
题目描述
给定一个正整数 (位数可达1000),请将其转写为科学计数法形式,形如:
。
具体而言,有如下要求:
为
之间的整数;
为对
的第二位数字进行四舍五入后的小数部分(保留一位小数);
为整数指数;
- 输出格式严格为
a.b*10^e
,无多余空格。
输入描述
一行输入正整数 ,不含前导零。
输出描述
输出 的科学计数法表示
a.b*10^e
。
样例1
输入
299792458
输出
3.0*10^8
样例2
输入
602214129000000000000000
输出
6.0*10^23
解题思路
由于给定的正整数 的位数可能非常长,我们需要将其作为字符串来处理。
科学记数法的一般形式为 。
- 指数
的值等于原数字字符串
的长度减一。
是通过对
的有效数字部分进行四舍五入得到的,需要保留一位小数。标准的四舍五入规则是看小数点后的第二位,即原始数字的第三位
。
具体步骤如下:
- 以字符串形式读入数字
。
- 指数
的值为
。
的值为
的第一位数字
。
的初始值为
的第二位数字
(如果存在)。
- 检查
的第三位数字
(如果存在)。如果
大于等于 '5',则对
进行进位。
- 如果
进位后变为 10,则将
置为 0,并对
进行进位。
- 如果
进位后变为 10(例如原数是 "999..."),则将
置为 1,并将指数
加 1。
- 最后,按照
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}")
算法及复杂度
- 算法:字符串处理、模拟
- 时间复杂度:
,其中
是输入数字字符串
的长度。
- 空间复杂度:
,用于存储输入的字符串
。