蓝桥杯python组之《M次方根》

题目叙述如下

对于给定大于1的整数N和M,我们要找到K,使得K的M次方等于N,并输出其保留7位小数的结果。

由于这道题有时间限制,因此采用二分查找的方式。

将K^(M)看作是K的函数,可以看出它是递增的。

初始start=1,end=N.

因此,mid= (start+end)/2,如果mid^(M)大于N,则end=mid.否则start=mid

这样逐步递推下去,会缩短K的取值范围,由于需要保留到7位小数,若缩短的区间长度(end-start)小于10的负9次方,由于已知K在区间内,因此区间内的任何一点与K的距离<10的负九次方,且区间中心mid与K的距离小于上述的一半。

因此,当缩短的区间长度(end-start)小于10的负9次方时,mid与K的前9位小数一般情况下保持相同,除非K的第8位、第9位小数是9,并且第10位小数的变化导致第九位、进一步导致第8位、进一步导致第7位的小数变化。

但无论是上述哪两种情况,mid四舍五入到第七位小数与K四舍五入到第七位小数的结果相同。

事实上,若将10的负9次方改为10的负8次方,按照上述同样思考,可能出现:K的第八位小数是4,mid的第八位小数由于第九位小数进位变成5,四舍五入后会导致第七位小数增加1.

由于round函数有很多坑,建议还是用’{:.7f}‘以四舍五入的方式输出mid的7位小数。

本人代码如下(验证通过):

N,M = map(int,input().split())
min_ = 1
max_ = N
mid = 0
while(True):
  mid = (min_+max_)/2
  if(pow(mid,M)<=N):
    min_ = mid
  else:
    max_ = mid
  if(abs(min_-max_)<pow(10,-9)):
    break
print('{:.7f}'.format(mid))

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中财不知名高手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值