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

1786673-20200301174838741-470957201.png

1786673-20200301174848673-466460447.png

1786673-20200301174908197-778489710.png

思路:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值