题目描述:
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].
[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
输入格式:
每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
输出格式:
对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
输入样例 1:
+1.23400E-03
输出样例 1:
0.00123400
输入样例 2:
-1.2E+10
输出样例 2:
-12000000000
解题思路:
1.读取输入:
读取用户输入的字符串,并假设它遵循科学计数法的格式(如 "123.456E+7" 或 "-987.65E-3")。
2.分割输入:
使用 'E' 或 'e' 作为分隔符,将输入的字符串分割为数字和指数两部分。
3.处理负号:
检查数字部分是否以负号开头,如果是,则在输出时先打印负号。
4.分割数字部分:
使用 '.' 作为分隔符,将数字部分进一步分割为整数部分和小数部分(如果有的话)。
5.处理指数部分:
转换指数部分为整数,并考虑指数前的符号(如果有的话)。如果指数前没有符号,则默认为正数。
6.构建输出:
根据指数的正负和大小,构建最终的输出字符串。
如果指数为0,则直接输出数字部分(注意负号)。
如果指数为正,则可能需要将小数部分向右移动或截断。
如果指数为负,则需要在小数部分前面添加足够的零,并可能需要将整数部分转换为小数形式。
7.打印输出:
打印构建好的输出字符串。
错误处理(未体现在您提供的代码中,但应该考虑):
添加必要的错误处理逻辑,以处理不符合预期格式的输入(例如,没有 '.' 或 'E')。
代码实现:
# 从用户输入中读取并分割科学计数法的数字和指数部分
num, e = input().split('E') # 假设输入格式正确,例如 "123.456E+7" 或 "-987.65E-3"
# 检查数字是否为负数
if num[0] == '-': # 如果第一个字符是负号,则数字是负数
print('-', end='') # 打印负号
# 移除可能的负号后,分割整数部分和小数部分
# 注意:这里假设num[1:]中一定包含'.',但如果没有'.',则r将为空字符串
l, r = num[1:].split('.') # 如果num[1:]中没有'.',则split会抛出异常
num2 = l + r
num_e = int(e[1:])
# 获取小数部分的长度,但如果r为空字符串,则len(r)将返回0
long = len(r)
# 如果指数为0,则直接打印数字(但需要注意负号的情况)
if num_e == 0:
print(num[1:])
# 处理正指数的情况
elif e[0] == '+':
cha = num_e - long # 计算需要移动的小数位数
if cha < 0: # 如果小数部分长度大于指数,则需要截断小数部分
print(num2[:(num_e + 1)] + '.' + num2[(num_e + 1):])
else: # 如果小数部分长度小于或等于指数,则在整数部分后添加零
print(num2 + '0' * cha)
# 处理负指数的情况
else:
print('0.' + '0' * (num_e - 1) + num2)
运行结果:![](https://img-blog.csdnimg.cn/direct/b5bf0bdd54ea4bee906a4ab515dc5f01.png)
改正建议:
这道题博主做了很久,之前刷这个题目的时候就没做出来,这几天发布题解做出来了,
但我在写博客的时候我自己是对自己的代码发现了一些问题,现在先将能过测试的代码
给大家,等后面有时间我会再更新代码的,这里我将可以改进的点列出来,大家有兴趣
的话可以改一改发给我看看,在评论区互动也可以,共同进步。
# 修正建议:
# 1. 单独处理负号
# 2. 单独处理整数部分和小数部分
# 3. 正确处理指数为0、正数和负数的情况
# 4. 确保输入格式正确,并处理可能的异常(如输入不包含'.'或'E')