2 ^ n вопрос (он не работал на больших количествах) - PullRequest
0 голосов
/ 23 февраля 2019

степень два - это число в форме 2n, где n - целое число, т. Е. Результат возведения в степень с номером два в качестве основания и целое число n в качестве показателя степени.

Я хочу проверить степеньНапример, если я ввожу 128, ввод программы должен быть True, потому что 128 = 2 ^ 7

, поэтому я написал этот код:

  import math
def power_of_two(x):
  if(x==0):
      print ("False")
      return False
  else:
      n = math.log2(x)
      if n%1 > 0:
          return False
      else:
          return True

, но в этом коде, если я попытаюсь дляпример 4096 работает хорошо, но если я попробую большие числа, например 4722366482869645213702, это не сработает, выведите True (должно быть False)

как я могу решить эту проблему ??

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
def power_of_two(x):
    return x > 0 and (x & (x-1)) == 0

Пояснение.Степени 2 выглядят как

10000000000000000000

После вычитания 1 они выглядят как

01111111111111111111

Битовый, и из этих чисел равно 0. Для других положительных чисел это ложь.

0 голосов
/ 23 февраля 2019

Простое решение - преобразовать число в двоичную форму, используя bin, а затем проверить, является ли первая цифра 1, а все остальные равны 0.

def is_a_power_of_two(x):
  if x == 1:
    return True
  b = bin(x)[2:]
  return int(b[0]) == 1 and int(b[1:]) == 0 

Это не очень быстро, ноесли выступления не являются проблемой для вас, тогда все в порядке.

Вы можете проверить, что нет ложных негативов, используя это:

for i in range(100):
  assert is_a_power_of_two(2**i)
...