题目描述
晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法、乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开 m 次根。
因为一个有理数开根之后可能得到一个无理数,所以这项工作是有较大难度的。
现在要做的只是这项工作的第一步:只对自然数进行开整数次根,求出它的一个非负根,并且不考虑结果的小数部分,只要求把结果截断取整即可。
程序需要根据给定的输入,包括需要开根的次数,以及被开根的整数;计算出它的非负根取整后的结果。
输入格式
第一行有一个正整数 m,表示要开的根次;
第二行有一个整数 n,表示被开根的数。
输出格式
共一行,包括一个数,即为开根取整后的结果。
数据范围
1≤m≤50,
0≤n≤1010000
输入样例:
3
1000000000
输出样例:
1000
样例
5
6240321450
代码借鉴: GRID
算法1
lower_bound
从小往大二分,上取整,肯定不会错。
m = int(input())
n = int(input())
l = 0
r = 1
while (r ** m <= n):
l = r
r *= 2
while (l < r):
mid = (l + r + 1) // 2
if (mid ** m <= n):
l = mid
else:
r = mid - 1
print(l)
#if(l**a<=b):
# print(l)
#else:
# print(r)
#这个地方不需要判断是否选左还是右边,因为总是找到的左边的第一个满足
算法2
upper_bound
a=int(input())
b=int(input())
l=0
r=1
while(r**a<=b):
l=r;r=r*2
while(l < r):
mid=(l+r)//2
if(mid**a >= b):
r=mid
else:
l=mid+1
if(l**a<=b):
print(l)
else:
print(r-1)
#这个地方需要判断是否选左还是右边,因为总是找到可能是最靠近B的数,
#而不是开平方后的数,开平方后会向下取整,所以需要这里单独减一处理一下。
<<<<<<<<<<=====>>>>>>>>>>
其解集应该是这样的,我们要找的是第一个=,然而upper_bound可能会找到最后一个=,因为开根号后会向下取整,所以最后是右边界减一即可。