当前位置: 首页 > 知识库问答 >
问题:

如何找到整数n根?

栾峰
2023-03-14

我想找到小于或等于n的第k个根的最大整数

int(n**(1/k))

但是对于n=125,k=3,这给出了错误的答案!我碰巧知道5的立方是125

>>> int(125**(1/3))
4

什么是更好的算法?

背景:2011年,这个失误让我打败了谷歌代码堵塞。https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2

共有3个答案

姜博
2023-03-14

我被严重烧伤后的谨慎解决方案:

def nth_root(N,k):
    """Return greatest integer x such that x**k <= N"""
    x = int(N**(1/k))      
    while (x+1)**k <= N:
        x += 1
    while x**k > N:
        x -= 1
    return x
景岳
2023-03-14

怎么样:

def nth_root(val, n):
    ret = int(val**(1./n))
    return ret + 1 if (ret + 1) ** n == val else ret

print nth_root(124, 3)
print nth_root(125, 3)
print nth_root(126, 3)
print nth_root(1, 100)

这里,valn都应该是整数和正数。这使得返回表达式完全依赖于整数算术,消除了舍入错误的任何可能性。

请注意,只有当val**(1./n)相当小时,才能保证准确性。一旦该表达式的结果偏离真实答案超过1,该方法将不再给出正确答案(它将给出与原始版本相同的近似答案)。

我仍然想知道为什么int(125**(1/3))4

In [1]: '%.20f' % 125**(1./3)
Out[1]: '4.99999999999999911182'

int()将其截断为4

柯树
2023-03-14

一种解决方案首先通过重复将hi乘以2将答案括在lo和hi之间,直到n在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
 类似资料:
  • 问题内容: 我想找到小于或等于n的第k个根的最大整数。我试过了 但是对于n = 125,k = 3,这给出了错误的答案!我碰巧知道5的立方是125。 有什么更好的算法? 背景:在2011年,这次滑坡使我击败了Google Code Jam。https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2 问题答案: 一个解决方案首先通

  • 问题内容: 如何找到与整数等效的罗马数字。是否有提供此功能的Java库? 问题答案: 这是许多语言(包括Java )的链接。这是相关的摘录:

  • 我对这个代码有问题。它应该找到三个数字的GCF,但它在else语句中不断出现错误。

  • 我想把一个整数变成一个金字塔。一、 E数字3: 因此,根据我找到的答案,我做了如下: 但它不起作用,而且是次优的。有没有一种简单的方法可以在同一行中重复整数n次? 也不是很高兴,但似乎我不能只使用System.out.println(int x, int n次)

  • 我想在一行中用n个整数填充一个列表,我试过了,但如何增加n的限制?

  • 本文向大家介绍在C ++中找到(1 ^ n + 2 ^ n + 3 ^ n + 4 ^ n)mod 5,包括了在C ++中找到(1 ^ n + 2 ^ n + 3 ^ n + 4 ^ n)mod 5的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将解决以下问题。 给定一个整数n,我们必须找到(1 n +2 n +3 n +4 n)%5 如果n大,则数字(1 n +2 n +3 n +4