您的位置:首页 > 编程语言 > Python开发

PAT (Basic Level) Practice (中文) 1024 科学计数法 (20 分) python 语言实现

2020-02-02 01:54 911 查看

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

解题吐槽:
我一拿到这个题的时候确实有点被吓到了。什么?10的9999次方?你tm在逗我?
但是后面仔细一想,大数顶不住就用字符串嘛。emmm,只要判断E后面数的正负,然后在前面或者后面添0就行了,然后我就成功的被第四个测试点坑惨了。
嗯,我这个菜鸡也只能搞搞字符串了,不知道那个大佬能用数学的方法解决这个问题

解题思路与代码:
首先,把输入的字符串分割一下,分成E前面的(Enum)和E后面的(En),其中Enum不是数,而是数字,不明白的看代码就懂了
然后判断En的符号,确定小数点的移动方向(而不是在那边添0),那么En的绝对值就是移动的位数
那么,En将会有以下几种情况:

  • En < 0: 这种情况就是小数点往左边移动,那么先输出一个“0.“,再输出|En| - 1个0,最后输出Enum就行了

  • En > 0: 此时小数点要往右边走,但是分了两种情况:

    En < len(Enum[1 :]): 也就是En比Enum小数点后面的长度小,这个时候小数点没有移动出去,不会在后补0 这样的话,只需要输出前En + 1个数,再输出小数点,最后输出剩下的数就行了
  • En >= len(Enum[1 :]): 也就是小数点向右移动出去了,要用0来补位了,这个时候只需要输出Enum再输出En - len(Enum[1 :])个0就可以了
  • En = 0:这种情况没啥好说的,Enum直接输出就可以了

  • 代码(python)

    #接收输入并将其从“E”拆成两部分,也就是上文的“小数点前面的数”和En
    num, n = input().split("E")
    #将小数点前面的数拆成数字,也就是Enum
    ans = [i for i in num if i.isalnum()]
    #如果是个负数,那就先把负号数出来,并把之前的En变成int型
    if num[0] == "-":
    print("-", end = "")
    n = int(n)
    #开始判断En的4种情况
    if n < 0:
    print("0.", end = "")
    for i in range(-n - 1):
    print(0, end = "")
    print("".join(ans), end = "")
    elif n > 0:
    if n >= len(ans[1:]):
    print("".join(ans), end = "")
    for i in range(n - len(ans) + 1):
    print(0, end = "")
    else:
    print("".join(ans[:n + 1]), ".", "".join(ans[n + 1:]), sep = "")
    else:
    print("".join(ans))
    • 点赞
    • 收藏
    • 分享
    • 文章举报
    Eumenides丶 发布了25 篇原创文章 · 获赞 0 · 访问量 993 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: