PAT (Basic Level) Practice 1024 科学计数法(python3)

题目描述:

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][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)  

运行结果:

改正建议:

这道题博主做了很久,之前刷这个题目的时候就没做出来,这几天发布题解做出来了,
但我在写博客的时候我自己是对自己的代码发现了一些问题,现在先将能过测试的代码
给大家,等后面有时间我会再更新代码的,这里我将可以改进的点列出来,大家有兴趣
的话可以改一改发给我看看,在评论区互动也可以,共同进步。
# 修正建议:  
# 1. 单独处理负号  
# 2. 单独处理整数部分和小数部分  
# 3. 正确处理指数为0、正数和负数的情况  
# 4. 确保输入格式正确,并处理可能的异常(如输入不包含'.'或'E')

  • 25
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值