Как найти корень куба с помощью Python?

Вот как, это лучший способ, я нашел:

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)

Есть ли лучший способ, предпочтительно тот, который позволяет избежать перебора значений кандидата?

Ответы

Ответ 1

Вы можете использовать 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 обрабатывают отрицательные числа до дробных полномочий по-разному).

Ответ 2

Лучший способ - использовать простую математику

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

Ответ 3

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