一尘不染

如何找到整数的第n个根?

algorithm

我想找到小于或等于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


阅读 227

收藏
2020-07-28

共1个答案

一尘不染

一个解决方案首先通过重复将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
2020-07-28