Накопал в гугле такой код:
n = int(input())
if n & (n - 1) :
print("NO")
else:
print("YES")
Единственное, не совсем понимаю как он работает, и как вывести степень?
То есть, я например ввожу n = 8
программа должна вывести 3
задан 18 окт 2019 в 17:00
4
Вот целых два способа:
n = int(input())
m = 1
i = 0
while m <= n:
if m==n:
print(i)
break
else:
m = m*2
i = i+1
if m > n:
print("No")
j = 0
while n != 1:
if n % 2 == 0:
n = n/2
j = j + 1
else:
break
if n == 1:
print(j)
else:
print("No")
ответ дан 19 окт 2019 в 4:37
MikhailoMikhailo
12.3k2 золотых знака17 серебряных знаков41 бронзовый знак
Решить задачу можно либо перебором, либо через логарифм(вот пример кода перебора):
n = int(input())
c = 0
for i in range(0, 1000):
if 2 ** i == n:
c += 1
print(i)
if c == 0:
print("НЕТ")
ответ дан 18 окт 2019 в 17:08
Просто КодерПросто Кодер
3012 серебряных знака15 бронзовых знаков
4
Как мне в Питоне найти степень двойки?
Ученик
(236),
закрыт
4 года назад
Alexey Prochorenko
Оракул
(55051)
4 года назад
умножай 2 на 2 и так далее и сравнивай с числом
если меньше, то умножай дальше, если равно выдавай число циклов, если больше – пиши “нет”
отдельная ветвь для отрицательных степеней, если надо
Аглая Шниц
Искусственный Интеллект
(115710)
4 года назад
print ((lambda x, n, l : l(x, n, l)) (int(input()), 0, lambda x, n, l : “НЕТ” if x&1 and x!=1 else str(n) if x==1 else l(x>>1,n+1, l)))
For integers only, you can get there in a slightly devious way with the following:
def justify(n):
return n / 1<<(n.bit_length()-1)
I’ve no idea if it’s faster without significant testing but a quick test with timeit
shows it to be about twice as fast as your first snippet.
However, converting n
to a float in the numerator (to get a float return) slows it to the same speed as your original.
def justify(n):
return float(n) / 1<<(n.bit_length()-1)
bit_length
gives the minimum number of bits required to represent abs(x)
which is actually going to be one more than you want for your calculation.
I would expect log(n,2)
to be heavily optimized for powers of two in the base – and it’s implemented in C. So you will have trouble beating it.
Possibly changing the denominator to 1<<int(log(n,2))
may give you better performance than the 2**
approach .. and it seems to be about 30% faster giving
def justify(n):
return float(n) / (1<<int(log(n,2)))
It is possible to do it completely with bitwise operators:
def justify_bitwise(n):
int_n = int(abs(n))
p = 0
while int_n != 1:
p += 1
int_n >>= 1
return float(n) / (1<<p)
But timeit
clocks this at 2.16 microseconds. An order of magnitude slower than using bit_length
Тебе же в прошлом вопросе разжевали всё, зачем снова плодить глупые вопросы? Но если ты прошлый вопрос спрашивал, чтобы таким образом проверять на степень двойки, то лучше сразу уходи их профессии. Изучи хотя бы основы построения алгоритмов.
Нормальная и быстрая проверка на степень двойки делается через бинарные операции:
def check2rec(num):
if num == 1:
return True
if num & 1:
return False
return check2rec(num >> 1)
Плюс, эту функцию можно ещё пооптимизировать.
Ну и бенчмарки, чтобы доказать ущербность логарифмического метода:
def check2rec(num):
if num == 1:
return True
if num & 1:
return False
return check2rec(num >> 1)
def check2log(num):
r = log(num, 2)
return int(r) == r
numbers = list()
print('Generating numbers...')
for _ in range(1000):
numbers.append(randint(10000, 1000000))
print('Done!')
start = datetime.datetime.now()
for _ in range(10000):
for n in numbers:
check2rec(n)
print('Rec: ', datetime.datetime.now() - start)
start = datetime.datetime.now()
for _ in range(10000):
for n in numbers:
check2log(n)
print('Log: ', datetime.datetime.now() - start)
Результаты:
Rec: 0:00:07.408942
Log: 0:00:12.101660
Разница почти в 2 раза.
P.S. С такими “знаниями” тебя в более-менее приличное место не возьмут никогда. Изучи сперва программирование (т.е. построение алгоритмов), а не язык. Почитай Вирта, Кормена, или SICP.
MrPeeklz 0 / 0 / 0 Регистрация: 02.05.2018 Сообщений: 4 |
||||
1 |
||||
Проверить, является ли заданное натуральное число степенью двойки02.05.2018, 18:05. Показов 146623. Ответов 32 Метки нет (Все метки)
Здравствуйте, форумчане. Есть следующее задание: Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя! Что нам надо ввести Натуральное число. Что надо вывести Ответ на задачу в виде:
Что мне изменить, чтобы он не выводил ненужные мне NO?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
02.05.2018, 18:05 |
32 |
woldemas 654 / 458 / 212 Регистрация: 06.09.2013 Сообщений: 1,266 |
||||
02.05.2018, 18:51 |
2 |
|||
MrPeeklz, у вас ветвь else в цикле каждый раз выполняется, вот он и выводит NO
1 |
Yntra 2 / 2 / 0 Регистрация: 22.04.2018 Сообщений: 18 |
||||
02.05.2018, 18:53 |
3 |
|||
Смысл решения изменять не нужно. Измените код на:
2 |
regio1961 594 / 286 / 178 Регистрация: 06.06.2016 Сообщений: 547 |
||||
02.05.2018, 20:59 |
4 |
|||
Если 0 не считать натуральным числом.
4 |
piece_of_idiocy 0 / 0 / 0 Регистрация: 04.04.2020 Сообщений: 5 |
||||
06.04.2020, 13:42 |
5 |
|||
Собственно, вот:
0 |
lime_is_life 31 / 29 / 2 Регистрация: 24.03.2020 Сообщений: 39 |
||||
26.04.2020, 10:51 |
6 |
|||
Вот так вот:
0 |
Byyf75 0 / 0 / 0 Регистрация: 09.06.2020 Сообщений: 1 |
||||
09.06.2020, 07:51 |
7 |
|||
0 |
outoftime ║XLR8║ 1212 / 909 / 270 Регистрация: 25.07.2009 Сообщений: 4,361 Записей в блоге: 5 |
||||
09.06.2020, 08:20 |
8 |
|||
MrPeeklz, woldemas, Yntra, regio1961, piece_of_idiocy, lime_is_life, Byyf75,
0 |
iSmokeJC Am I evil? Yes, I am! 15982 / 8994 / 2604 Регистрация: 21.10.2017 Сообщений: 20,695 |
||||
09.06.2020, 09:20 |
9 |
|||
3 |
Fudthhh Модератор 2869 / 1572 / 508 Регистрация: 21.02.2017 Сообщений: 4,197 Записей в блоге: 1 |
||||
09.06.2020, 09:25 |
10 |
|||
iSmokeJC, чего ж ты молодой, бумагу то не экономишь?
2 |
║XLR8║ 1212 / 909 / 270 Регистрация: 25.07.2009 Сообщений: 4,361 Записей в блоге: 5 |
|
09.06.2020, 09:27 |
11 |
чего ж ты молодой, бумагу то не экономишь? С какой версии так делать можно?
0 |
Модератор 2869 / 1572 / 508 Регистрация: 21.02.2017 Сообщений: 4,197 Записей в блоге: 1 |
|
09.06.2020, 09:27 |
12 |
outoftime, 3.8.X Моржовый оператор
0 |
║XLR8║ 1212 / 909 / 270 Регистрация: 25.07.2009 Сообщений: 4,361 Записей в блоге: 5 |
|
09.06.2020, 09:32 |
13 |
0 |
Am I evil? Yes, I am! 15982 / 8994 / 2604 Регистрация: 21.10.2017 Сообщений: 20,695 |
|
09.06.2020, 09:33 |
14 |
DmFat, ну, молодозелено, че
0 |
Ergo_py 2 / 2 / 0 Регистрация: 24.08.2020 Сообщений: 15 |
||||
25.08.2020, 12:17 |
15 |
|||
0 |
владикНЕвладик 1 / 1 / 0 Регистрация: 20.04.2019 Сообщений: 59 |
||||
04.11.2020, 18:18 |
16 |
|||
Вот, всё работает
0 |
Am I evil? Yes, I am! 15982 / 8994 / 2604 Регистрация: 21.10.2017 Сообщений: 20,695 |
|
04.11.2020, 18:27 |
17 |
всё работает Не, чет не работает
1 |
1 / 1 / 0 Регистрация: 20.04.2019 Сообщений: 59 |
|
04.11.2020, 18:40 |
18 |
Чувак, это на С++, а ты мучаешь питошку
0 |
Am I evil? Yes, I am! 15982 / 8994 / 2604 Регистрация: 21.10.2017 Сообщений: 20,695 |
|
04.11.2020, 18:45 |
19 |
владикНЕвладик, в самом деле? А я думал в ветке Python на питоне пишут… Добавлено через 1 минуту
0 |
1 / 1 / 0 Регистрация: 20.04.2019 Сообщений: 59 |
|
04.11.2020, 18:45 |
20 |
Сорян, не подумал, но в итоге имея пример даже на другом языке можно же переписать на нужный язык
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.11.2020, 18:45 |
Помогаю со студенческими работами здесь Определить, является ли заданное число степенью двойки Определить, является ли натуральное число N степенью двойки Является ли натуральное число точной степенью двойки Определить, является ли заданное число точной степенью двойки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |