2016-10-20 3 views
0
x=int(input("Enter an integer:")) 
answer=None 
cube_root_found=False 
for i in range(0,abs(x)+1): 
    if i**3 == abs(x): 
     answer=i 
     cube_root_found=True 
if not cube_root_found: 
    print(x,"is not a perfect cube") 
else: 
    if x<0: 
     answer=-answer 
    print("Cube root of",x,"is",answer) 

Я не мог понять, почему мы использовали ответ = None и cube_root_found = False на второй line.And другой вопрос в том, как я уже упоминал в названии: Как мы можем сделать этот код более эффективным?Как сделать этот код более эффективным?

+2

Как только вы найдете корень куба, вы можете «вырваться» из цикла. –

+1

Возможный дубликат [Как найти корень куба с помощью Python?] (Http://stackoverflow.com/questions/28014241/how-to-find-cube-root-using-python) – cpatricio

ответ

1

Добавление break после cube_root_found = True приведет к короткому замыканию, когда оно найдет ответ вместо продолжения.

x=int(input("Enter an integer:")) 
answer=None 
cube_root_found=False 
for i in range(0,abs(x)+1): 
    if i**3 == abs(x): 
     answer=i 
     cube_root_found=True 
     break 
if not cube_root_found: 
    print(x,"is not a perfect cube") 
else: 
    if x<0: 
     answer=-answer 
    print("Cube root of",x,"is",answer) 
2

Я имею в виду, есть математическое решение для этого - просто кубического корня x, а не испытывать все в [0, x+1). В этом случае нет причин зацикливаться.

x = int(input("Enter an integer: ")) 
result = x ** (1/3) 
if result == int(result): 
    print("Cube root of", x, "is", result) 
else: 
    print(x, "is not a perfect cube") 
+1

Это не работает для 9796532 * * 3. 1/3 не имеет хорошего двоичного представления, поэтому есть ошибки округления. – Scott

+1

Вы могли бы попробовать и пол И cieling. Ошибок округления никогда не будет так много – Scott

+0

@Scott вы можете перечислять возможные решения вокруг «результата», но в конечном итоге работа с большими числами вызывает проблемы с плавающей точкой, не связанные с вашей реализацией. Если вы ожидаете решения для больших чисел, это компромисс, который вам нужно осознавать. –

1

Вместо итерацию через кучу целых чисел, просто взять кубический корень вашего входа и проверить, если это целое число.

так что-то вроде этого:

root = x**(1.0/3.0) return root.is_integer()

+0

Такая же проблема здесь.Это не работает для root = 9796532 ** 3. 1/3 не имеет хорошего двоичного представления, поэтому есть ошибки округления – Scott

+0

с использованием numpy следует избавиться от некоторых из этих ошибок. кроме того, я - это вопрос домашней работы. –

0

answer=None cube_root_found=False

Мы делаем это, потому что, если x равен 0, то для контуров будет выполняться 0 раз. В этом случае, без кода выше, мы никогда не будем присваивать значение этих переменных, и

if not cube_root_found:

потерпит неудачу с "NameError: name 'cube_root_found' is not defined сообщением.

0

Помимо использования перерыва, я хотел бы предложить ограничение диапазона абса (х)/2 - если это не либо -1, 0 или 1.

Кроме того, я не уверен, может ли Python оптимизацию вызова абс на каждом цикле на то же значение - скорее всего, нет, так что я бы предварительно магазин абс (х)

abs_x = abs(x) 
upper_limit = 2 if abs_x < 2 else abs_x/2 
for i in range(upper_limit): 
    if i**3 == abs_x: 
...... 
0

проверки, если int(n**(1./3)) == n**(1./3) не работает вообще, си nce 1/3 не представляет красиво в двоичном формате. try abs(int(n**(1./3)) == n**(1./3)) < 0.000000000001

Проверка в пределах порога является нормальным способом проверки равенства при наличии ошибок округления. Заметим, что (n + 1) ** (1/3) -> n ** (1/3) при увеличении n, поэтому это даст неверные результаты для очень очень большого n.

Смежные вопросы