Как найти корень куба с помощью 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.)