蓝桥杯 - 小数第n位(python语言实现)



思路:
n的数值很大,python自带的算高精度加减乘还行,除法是真没找到自带方法实现。
所以需要模拟除法的过程,以n/m为例:
n >= m:商上n // m,n = n % m
n < m:商上n * 10 // m,n = n * 10 % m
(笔算一下100/3的过程就可以推导)

同时,题目给出了剪枝条件,要么是有限小数,要么是无限循环小数
如何处理循环小数?-> 记录n的使用情况(即check[x] = n=x的时候,对应的小数第几位),只要某一次的n已经被访问过了,那么表示出现了循环。再把循环部分直接拼接到字符串后面即可,其实还可以优化不用拼接,直接根据当前字符串长度与目标长度的差值,进行取余balabla,应该更快(不想写了..

代码:

n, m, t = list(map(int, input("").split(" ")))
while n >= m:
    n = n % m
# 当前正在计算小数第几位
i = 0
# 结果字符串
s = ""
# 记录n的使用情况
check = {}
# n < m
while n:
    if n in check:
        # 表示开始出现了循环,找到上一个n的位置
        last = check[n]
        # 循环的部分是last~i-1
        circle = s[last:i]
        # 这里+10就是保证字符串的长度足够(加上其他的也可以
        s += ((t-i)//len(circle) + 10) * circle
        break
    check[n] = i
    s += str(n*10//m)
    n = n*10%m
    i += 1
    if i == t+10:
        break
s = s[t-1:t+2]
# 不足的补上"0"
s += (3 - len(s)) * "0"
print(s)
posted @ 2020-03-03 16:48  但是我拒绝  阅读(772)  评论(1编辑  收藏  举报