我想找到小于或等于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
我被严重烧伤后的谨慎解决方案:
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
怎么样:
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)
这里,val
和n
都应该是整数和正数。这使得返回表达式完全依赖于整数算术,消除了舍入错误的任何可能性。
请注意,只有当val**(1./n)
相当小时,才能保证准确性。一旦该表达式的结果偏离真实答案超过1
,该方法将不再给出正确答案(它将给出与原始版本相同的近似答案)。
我仍然想知道为什么int(125**(1/3))
是4
In [1]: '%.20f' % 125**(1./3)
Out[1]: '4.99999999999999911182'
int()
将其截断为4
。
一种解决方案首先通过重复将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