题目叙述如下
对于给定大于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_)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)