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

蓝桥杯python组之《M次方根》,第1张

题目叙述如下

对于给定大于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_)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/571512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)