原题
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+ -][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。
- 如果大于0,该数一定是
±
+0.
开头,就把"0."
存入列表中,然后通过移动位数确定小数点后面 0 的个数n
,把n
个0组成的字符串存入列表中,接着把原数中个位数
上的值存入列表中,再将小数部分decimal_part
放入列表中即可; - 如果等于0,按就是按原数输出,将
个位数
上的值先放入列表中,再将小数点"."
,存入列表中,接着把小数部分放入小数部分decimal_part
放入列表中。
- 如果大于0,该数一定是
- 如果是向右移,需要判断右移的位数是否大于小数部分的长度。
- 如果大于小数部分的长度,先将原数的小数部分放入列表中,紧接着把小数部分放入列表中,然后判断需要补充0的个数
n
,将n
个0组成的字符串放入列表中即可; - 如果小于小数部分的长度,先将原数的小数部分放入列表中,然后计算小数点在小数部分的位置之后,对小数部分进行切片
假设切片之后变成 A 和 B 两个子串
,将A
放入列表之后,将小数点"."
放入列表中,再将B
放入列表中即可。
- 如果大于小数部分的长度,先将原数的小数部分放入列表中,紧接着把小数部分放入列表中,然后判断需要补充0的个数
最后按顺序将列表中的元素输出。
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='')