蓝桥杯 - 小数第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)