Как найти степень двойки в питоне

Накопал в гугле такой код:

n = int(input())
if n & (n - 1) :
    print("NO")
else:
    print("YES")

Единственное, не совсем понимаю как он работает, и как вывести степень?
То есть, я например ввожу n = 8 программа должна вывести 3

задан 18 окт 2019 в 17:00

Просто Кодер's user avatar

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

Mikhailo's user avatar

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

Просто Кодер's user avatar

Просто КодерПросто Кодер

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 в противном случае. Операцией возведения в степень пользоваться нельзя!

Что нам надо ввести

Натуральное число.

Что надо вывести

Ответ на задачу в виде:
“YES” или “NO”

Python
1
2
3
4
5
6
7
8
n = int(input())
i = 1
while i < n:
    i = i * 2
    if i == n:
        print("YES")
    else:
        print("NO")

Что мне изменить, чтобы он не выводил ненужные мне NO?
А то получается
NO
NO
NO
NO
YES



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
Я бы как-нибудь так написал:

Python
1
2
3
4
5
6
7
8
9
n = int(input())
while True:
    if n == 1: 
        print('YES')
        break
    elif n & 1:
        print('NO')
        break
    n >>= 1



1



Yntra

2 / 2 / 0

Регистрация: 22.04.2018

Сообщений: 18

02.05.2018, 18:53

3

Смысл решения изменять не нужно. Измените код на:

Python
1
2
3
4
5
6
7
8
n = int(input())
i = 1
while i < n:
    i = i * 2
if i == n:
    print("YES")
else:
    print("NO")



2



regio1961

594 / 286 / 178

Регистрация: 06.06.2016

Сообщений: 547

02.05.2018, 20:59

4

Python
1
2
3
4
5
n = int(input())
if n & ( n - 1 ):
    print( "NO" )
else:
    print( "YES" )

Если 0 не считать натуральным числом.



4



piece_of_idiocy

0 / 0 / 0

Регистрация: 04.04.2020

Сообщений: 5

06.04.2020, 13:42

5

Собственно, вот:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
n = int(input())
i = 1
result = 0
while i < n:
    i = i * 2
    if i == n:
        result = 1
    else:
        result = 0
if result == 1:
    print("YES")
else:
    print("NO")



0



lime_is_life

31 / 29 / 2

Регистрация: 24.03.2020

Сообщений: 39

26.04.2020, 10:51

6

Вот так вот:

Python
1
2
3
4
5
6
7
8
9
10
n = int(input())
i = 1
an = ''
while i < n:
    i = i * 2
    if i == n:
        an = 'YES'
    else:
        an = 'NO'
print(an)



0



Byyf75

0 / 0 / 0

Регистрация: 09.06.2020

Сообщений: 1

09.06.2020, 07:51

7

Python
1
2
3
4
5
6
7
8
n = int(input())
i = 1
while i < n:
    i = i * 2
if i == n:
    print("YES")
else:
    print("NO")



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,

Python
1
2
n = int(input())
print("YES" if bin(n).count('1') == 1 else "NO")



0



iSmokeJC

Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

15982 / 8994 / 2604

Регистрация: 21.10.2017

Сообщений: 20,695

09.06.2020, 09:20

9

Python
1
2
n = int(input())
print("NO" if n & (n - 1) else "YES")



3



Fudthhh

Модератор

Эксперт Python

2869 / 1572 / 508

Регистрация: 21.02.2017

Сообщений: 4,197

Записей в блоге: 1

09.06.2020, 09:25

10

iSmokeJC, чего ж ты молодой, бумагу то не экономишь?

Python
1
print("NO" if (n := int(input())) & (n - 1) else "YES")



2



║XLR8║

1212 / 909 / 270

Регистрация: 25.07.2009

Сообщений: 4,361

Записей в блоге: 5

09.06.2020, 09:27

11

Цитата
Сообщение от DmFat
Посмотреть сообщение

чего ж ты молодой, бумагу то не экономишь?

С какой версии так делать можно?



0



Модератор

Эксперт Python

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!

Эксперт PythonЭксперт Java

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

Python
1
2
3
4
5
6
7
8
9
10
a = int(input())
while a != 1 and a / 2 != 1:
    a = a - (a / 2)
    if a == int(a):
        continue
    elif a != int(a):
        print('No')
        break
if a / 2 == 1 or a == 1:
        print('Yes')



0



владикНЕвладик

1 / 1 / 0

Регистрация: 20.04.2019

Сообщений: 59

04.11.2020, 18:18

16

Вот, всё работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main () {
    int n, i = 0;
    cin >> n;
    while (n) {
        i += n % 2;
        n /= 2;
    }
    if (i == 1){
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl; 
    }
    system("pause");
    return 0;
}



0



Am I evil? Yes, I am!

Эксперт PythonЭксперт Java

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!

Эксперт PythonЭксперт Java

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

Помогаю со студенческими работами здесь

Определить, является ли заданное число степенью двойки
Говорят, что плохой программист – это тот, кто считает, что в одном килобайте 1000 байт, а хороший…

Определить, является ли натуральное число N степенью двойки
Определить, является ли натуральное число N степенью двойки
while

Является ли натуральное число точной степенью двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или…

Определить, является ли заданное число точной степенью двойки
Дано натуральное число N. Вывести слово YES, если число N является точной степенью двойки, или…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

Добавить комментарий