以下是我发现的最佳方法:
x = int(raw_input("Enter an integer: "))
for ans in range(0, abs(x) + 1):
if ans ** 3 == abs(x):
break
if ans ** 3 != abs(x):
print x, 'is not a perfect cube!'
else:
if x < 0:
ans = -ans
print 'Cube root of ' + str(x) + ' is ' + str(ans)
有没有更好的方法,最好是避免迭代候选值?
答案 0 :(得分:29)
您可以使用x ** (1. / 3)
来计算x
的(浮点)多维数据集根。
这里的细微之处在于,对于Python 2和3中的负数,这种方式有所不同。但是,以下代码处理:
def is_perfect_cube(x):
x = abs(x)
return int(round(x ** (1. / 3))) ** 3 == x
print(is_perfect_cube(63))
print(is_perfect_cube(64))
print(is_perfect_cube(65))
print(is_perfect_cube(-63))
print(is_perfect_cube(-64))
print(is_perfect_cube(-65))
print(is_perfect_cube(2146689000)) # no other currently posted solution
# handles this correctly
这取x
的立方根,将其四舍五入到最接近的整数,升至三次幂,最后检查结果是否等于x
。
获取绝对值的原因是使代码在Python版本中正确处理负数(Python 2和3将负数提升为分数幂)。
答案 1 :(得分:19)
最好的方法是使用简单的数学
>>> a = 8
>>> a**(1./3.)
2.0
修改强>
对于负数
>>> a = -8
>>> -(-a)**(1./3.)
-2.0
完成所有要求的程序
x = int(input("Enter an integer: "))
if x>0:
ans = x**(1./3.)
if ans ** 3 != abs(x):
print x, 'is not a perfect cube!'
else:
ans = -((-x)**(1./3.))
if ans ** 3 != -abs(x):
print x, 'is not a perfect cube!'
print 'Cube root of ' + str(x) + ' is ' + str(ans)
答案 2 :(得分:4)
def cube(x):
if 0<=x: return x**(1./3.)
return -(-x)**(1./3.)
print (cube(8))
print (cube(-8))
以下是负数和正数的完整答案。
>>>
2.0
-2.0
>>>
或者这是一个单行;
root_cube = lambda x: x**(1./3.) if 0<=x else -(-x)**(1./3.)