我想找到小于或等于n的第k个根的最大整数。我试过了
int(n**(1/k))
但是对于n = 125,k = 3,这给出了错误的答案!我碰巧知道5的立方是125。
>>> int(125**(1/3)) 4
有什么更好的算法?
背景:在2011年,这次滑坡使我击败了Google Code Jam。https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2
一个解决方案首先通过重复将hi乘以2直到n在lo和hi之间,将lo和hi之间的答案括起来,然后使用二进制搜索来计算确切的答案:
def iroot(k, n): hi = 1 while pow(hi, k) < n: hi *= 2 lo = hi // 2 while hi - lo > 1: mid = (lo + hi) // 2 midToK = pow(mid, k) if midToK < n: lo = mid elif n < midToK: hi = mid else: return mid if pow(hi, k) == n: return hi else: return lo
一种不同的解决方案使用牛顿方法,该方法对整数非常有效:
def iroot(k, n): u, s = n, n+1 while u < s: s = u t = (k-1) * s + n // pow(s, k-1) u = t // k return s