PAT乙级练习题_1024“科学计数法”_python解题

原题

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

my answer

思路:用一个列表[]按顺序存储要输出数的各个部分。以-1.2E+10为例,先判断该数是否是负数,如果是负数就将"-"存入列表中["-"],然后将科学计数法中小数点后面到E符号之前的小数部分用字符串存起来decimal_part = "2",然后再用一个布尔类型的值用来确定小数点是向左移还是右移(即指数的正负号,也即E后面的正负)在本例中,direction = False # 小数点移动的方向,True 表示左移;False 表示右移,然后以整数类型存储指数的 大小 也是小数点要移动的位数 在本例中,move_number = 0
做完上面的准备工作就可以向事先定义好的列表["-"]中按顺序添加输出的各个部分内容:
首先判断是向左移还是向右移。

  • 如果向左移需要判断移动的位数是否大于0。
    1. 如果大于0,该数一定是±+0.开头,就把"0."存入列表中,然后通过移动位数确定小数点后面 0 的个数n,把n个0组成的字符串存入列表中,接着把原数中个位数上的值存入列表中,再将小数部分decimal_part放入列表中即可;
    2. 如果等于0,按就是按原数输出,将个位数上的值先放入列表中,再将小数点".",存入列表中,接着把小数部分放入小数部分decimal_part放入列表中。
  • 如果是向右移,需要判断右移的位数是否大于小数部分的长度。
    1. 如果大于小数部分的长度,先将原数的小数部分放入列表中,紧接着把小数部分放入列表中,然后判断需要补充0的个数n,将n个0组成的字符串放入列表中即可;
    2. 如果小于小数部分的长度,先将原数的小数部分放入列表中,然后计算小数点在小数部分的位置之后,对小数部分进行切片假设切片之后变成 A 和 B 两个子串,将A放入列表之后,将小数点"."放入列表中,再将B放入列表中即可。

最后按顺序将列表中的元素输出。

input_str = input()

result = [] # 用于存储结果
if input_str[0] == "-": # 如果是负数,就将负号输出
    result.append("-")


decimal_part = "" # 小数部分
direction = True # 小数点移动的方向,True 表示左移;False 表示右移
move_number = 0 # 小数点移动的位数
for i in range(1, len(input_str)):
    if input_str[i] == "E":
        decimal_part = input_str[3:i]
    if input_str[i] == "+":
        direction = False
        move_number = int(input_str[i+1:])
        break
    elif input_str[i] == "-":
        direction = True
        move_number = int(input_str[i+1:])
        break

if direction: # 如果是左移
    if move_number == 0: # 如果移动的位数为0
        result.append(input_str[1:3]) # 将小数点前面的数字输出
        result.append(decimal_part) # 将小数点后面的数字输出
    if move_number > 0:  # 如果移动的位数大于0
        result.append("0.") # 先将固定的格式输出
        result.append("0"*(move_number-1)) # 计算补零的个数
        result.append(input_str[1:2]) # 再将第一位数字输出
        result.append(decimal_part) # 将小数点后的数字输出
else:         # 如果小数点右移
    result.append(input_str[1:2]) # 先将原数中小数点前面的数字输出
    if move_number == 0: # 如果小数点移动的位数为0
        result.append(input_str[2:3]) # 将小数点输出
        result.append(decimal_part) # 将小数点后面的数字输出
    elif move_number < len(decimal_part): # 如果移动的位数小于小数部分的长度
        result.append(decimal_part[:move_number]) # 对小数部分进行切片,分为两部分,先将第一部分放入列表
        result.append(".") # 再将小数点放入列表
        result.append(decimal_part[move_number:]) # 最后将小数部分后半段放入列表
    else: # 如果移动的位数大于小数部分的长度
        result.append(decimal_part) # 直接将小数部分放入列表中
        result.append("0"*(move_number-len(decimal_part))) # 再计算要补的 0 的个数
for i in result:
    print(i, end='')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值