Ehs*_*ani 11 python python-3.x
这似乎很简单,但我找不到办法.我需要显示整数的立方根是否为整数.我is_integer()在Python 3.4中使用了float方法但是没有成功.如
x = (3**3)**(1/3.0)
is_integer(x)
True
Run Code Online (Sandbox Code Playgroud)
但
x = (4**3)**(1/3.0)
is_integer(x)
False
Run Code Online (Sandbox Code Playgroud)
我想x%1 == 0,x == int(x)并isinstance(x,int)没有成功.
我很感激任何评论.
nne*_*neo 23
对于较小的数字(<~10 13左右),您可以使用以下方法:
def is_perfect_cube(n):
c = int(n**(1/3.))
return (c**3 == n) or ((c+1)**3 == n)
Run Code Online (Sandbox Code Playgroud)
这会截断浮点Cuberoot,然后测试两个最接近的整数.
对于较大的数字,一种方法是使用整数对真正的立方根进行二进制搜索,以保持精度:
def find_cube_root(n):
lo = 0
hi = n
while lo < hi:
mid = (lo+hi)//2
if mid**3 < n:
lo = mid+1
else:
hi = mid
return lo
def is_perfect_cube(n):
return find_cube_root(n)**3 == n
Run Code Online (Sandbox Code Playgroud)
SymPy 中还有一个integer_nthroot函数可以快速找到一个数字的整数 n 次方根并告诉你它是否准确:
>>> integer_nthroot(primorial(12)+1,3)
(19505, False)
Run Code Online (Sandbox Code Playgroud)
所以你的函数可以是
def is_perfect_cube(x): return integer_nthroot(x, 3)[1]
Run Code Online (Sandbox Code Playgroud)
(因为 SymPy 是开源的,所以您可以查看例程以了解如何integer_nthroot工作。)