题目链接
题目描述
将一个给定的正整数 转换为
a.b*10^c
形式的科学记数法。要求 a.b
的值在 范围内,并四舍五入到小数点后一位。
解题思路
本题的核心在于处理大数和实现带进位的四舍五入。由于输入的整数可能非常大,超过标准整型(如 long long
)的表示范围,因此最稳妥的方法是将其作为字符串来处理。
算法步骤如下:
-
读取输入:将正整数
作为字符串
s
读入。 -
计算指数
c
:科学记数法的指数由数字的位数决定。如果字符串s
的长度为L
,则该数可以表示为s[0].s[1]s[2]... * 10^(L-1)
。因此,指数c
就是L - 1
。 -
提取基数部分
a
和b
:- 系数的整数部分
a
总是字符串的第一个字符s[0]
。 - 系数的小数部分
b
由第二个字符s[1]
决定,但需要考虑第三个字符s[2]
的影响来进行四舍五入。
- 系数的整数部分
-
实现四舍五入与进位:
- 我们定义三个变量来存储
a
、b
和用于判断的第三位数字的整数值。 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_b
是9
),那么val_b
应变为0
,同时val_a
需要加一:val_a++
。 - 处理向指数
c
的进位:如果val_a
在进位后等于10
(即原先val_a
是9
),那么val_a
应变为1
,并且指数c
需要加一。例如,9.95
四舍五入为10.0
,在科学记数法中应表示为1.0
,同时指数加一。
- 我们定义三个变量来存储
-
格式化输出:将最终计算出的
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()
算法及复杂度
- 算法:字符串处理
- 时间复杂度:
,其中
是输入数字字符串的长度。主要开销在于读取字符串。后续的计算都是常数时间操作。
- 空间复杂度:
,用于存储输入的字符串。