多维数据集根整数?

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)

  • 然后使用二进制搜索方法. (2认同)
  • 对于二进制搜索,您可以获取输入的对数,并使用它来计算初始的“ lo”和“ hi”,以限制搜索空间。 (2认同)

smi*_*chr 6

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工作。)