Here is how, this is the best way, I have found:

``````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)
``````

Is there a better way, preferably one that avoids having to iterate over candidate values?

You could use `x ** (1. / 3)` to compute the (floating-point) cube root of `x`.

The slight subtlety here is that this works differently for negative numbers in Python 2 and 3. The following code, however, handles that:

``````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
``````

This takes the cube root of `x`, rounds it to the nearest integer, raises to the third power, and finally checks whether the result equals `x`.

The reason to take the absolute value is to make the code work correctly for negative numbers across Python versions (Python 2 and 3 treat raising negative numbers to fractional powers differently).

The best way is to use simple math

``````>>> a = 8
>>> a**(1./3.)
2.0
``````

EDIT

For Negative numbers

``````>>> a = -8
>>> -(-a)**(1./3.)
-2.0
``````

Complete Program for all the requirements as specified

``````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)
``````

``````def cube(x):
if 0<=x: return x**(1./3.)
return -(-x)**(1./3.)
print (cube(8))
print (cube(-8))
``````

Here is the full answer for both negative and positive numbers.

``````>>>
2.0
-2.0
>>>
``````

Or here is a one-liner;

``````root_cube = lambda x: x**(1./3.) if 0<=x else -(-x)**(1./3.)
``````