5.01 Запись числа в двоичной системе счисления
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Исполнитель Олень получает число и строит по нему новое число следующим образом:
- Строится двоичная запись числа
.
- Вместо последней двоичной цифры дважды записывается вторая слева цифра двоичной записи.
- Результат переводится в десятичную систему.
Полученная таким образом запись (в ней на один разряд больше, чем в записи исходного числа ) является двоичной
записью искомого числа
.
Укажите такое наименьшее число , для которого Олень получит число, большее, чем
. В ответе это число
запишите в десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin, затем используем срез [:-1], чтобы избавиться от последней цифры. С помощью сложения строк дважды
дописываем в конец вторую слева цифру, которая имеет индекс 1. Осталось перевести результат в десятичную систему
счисления, после чего получим R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 177. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for n in range(2, 1000): # Перебор значений N от 2 до 999 включительно r = bin(n)[2:] # Получаем двоичную запись числа N r = r[:-1] + r[1] + r[1] # "Срезаем" последнюю цифру и дописываем два раза вторую слева r = int(r, 2) # Получаем итоговое число в десятичной системе счисления if r > 177: # Проверка выполнения условия print(n) break # Первое выведенное N будет минимальным
Решение аналитически
Переведем . Последние 2 цифры не совпадают с второй слева цифрой, получается ищем
следующее.
Переведем . Также не совпадает.
Переведем . Вторая слева и последние 2 совпадают. Обрубаем последние.
. Сейчас также нам
не хватает обрубленной цифры, и чтобы вышло наименьшее N нужно взять 0.
.
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число R следующим образом:
1. Строится двоичная запись числа .
2. Вместо последней (самой правой) двоичной цифры дважды записывается вторая слева цифра двоичной записи.
3. Результат переводится в десятичную систему.
Пример. Дано число . Алгоритм работает следующим образом:
1. Двоичная запись числа .
2. Вторая слева цифра , единица в конце записи заменяется на два нуля, новая запись
.
3. Результат работы алгоритма .
При каком наименьшем числе в результате работы алгоритма получится
? В ответе запишите это число в
десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin, затем избавляемся от последней цифры, используя срез [:-1]. Прибегнув к сложению строк, дважды
дописываем в конец вторую слева цифру, которая имеет индекс 1. Осталось перевести результат в десятичную систему
счисления, после чего получим R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 48. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for n in range(2, 1000): # Перебор значений N > 1 r = bin(n)[2:] # Получаем двоичную запись числа N r = r[:-1] + r[1] + r[1] # "Срезаем" последнюю цифру и дописываем два раза вторую слева r = int(r, 2) # Получаем итоговое число в десятичной системе счисления if r > 48: # Проверка выполнения условия print(n) break # Первое выведенное N будет минимальным
Аналитическое решение:
Переведем . Не совпадают.
Переведем . Не совпадают.
Переведем . Совпали. Обрубим
последние цифры и припишем
.
.
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число
следующим образом:
- Строится двоичная запись числа
.
- В конец записи (справа) дописывается вторая слева цифра двоичной записи.
- В конец записи (справа) дописывается вторая справа цифра двоичной записи числа
.
- Результат переводится в десятичную систему.
Пример. Дано число . Алгоритм работает следующим образом:
- Двоичная запись числа
.
- Вторая слева цифра
, новая запись
.
- Вторая справа цифра
, новая запись
.
- Результат работы алгоритма
.
При каком наибольшем числе в результате работы алгоритма получится
? В ответе запишите это число в
десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную
строку с помощью функции bin, затем, используя сложение строк, дописываем в конец вторую слева цифру,
которая имеет индекс 1. Далее дописываем вторую справа цифру изначальной записи, которая имеет индекс
-2 (вторая с конца). Осталось перевести результат в десятичную систему счисления, после чего получим
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, меньше ли оно 90. Если условие выполняется, запоминаем N. Важно отметить, что нет необходимости проверять, что текущее N – наибольшее, ведь цикл гарантирует, что N перебираются по возрастанию. Выводим последнее (наибольшее) подходящее N.
ans = 0 # Переменная для хранения наибольшего N for i in range(2, 1000): # Перебор значений N > 1 s = bin(i)[2:] # Получаем двоичную запись числа N s += s[1] + s[-2] # Дописываем вторую слева цифру и вторую справа r = int(s, 2) # Получаем итоговое число в десятичной системе счисления if r < 90: ans = i print(ans)
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1)Строится двоичная запись числа N.
2)К этой записи дописываются справа ещё два разряда по следующему правилу:
а)Дописывается справа бит чётности: 0, если в двоичном коде числа N было чётное число единиц, и 1, если нечётное;
б)К полученному результату дописывается ещё один бит чётности
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число, большее, чем 78. В ответе это число запишите в десятичной системе.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью
функции bin, затем вычисляем количество единиц с помощью метода count. Если это количество чётное,
дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же
действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 78. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for i in range(1, 1000): # Перебираем числа N от 1 до 999 включительно s = bin(i)[2:] # Перевод в двоичную систему # Вычисляем бит чётности if s.count("1") % 2 == 0: # Если количество единиц чётно, дописываем 0, иначе - 1 s += "0" else: s += "1" # Повторяем предыдущий шаг, но уже для изменённой записи if s.count("1") % 2 == 0: s += "0" else: s += "1" if int(s, 2) > 78: # Получаем R # Первое выведенное N будет минимальным print(i) # Выводим N break # Завершаем цикл
Аналитическое решение:
Если изначальное число имеет чётное количество единиц, то после добавления нуля количество единиц не
изменится, а потому на следующем шаге также добавится ноль. Итого к числу допишут два нуля.
Если изначально число имеет нечётное количество единиц, то после добавления единицы количество единиц
увеличится на 1, что означает, что количество единиц станет чётным числом, а значит на следующем шаге уже будут
добавлять ноль. Итого к числу допишут единицу и ноль.
Значит мы будем проверять только числа, которые кончаются на или
.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число 80? В двоичной СС оно выглядит как . Так что вполне возможно. Если откинем
последние две цифры, то у нас останется число
, у него чётное число единиц, а значит после работы алгоритма к
нему дописали бы два нуля, но это как раз те самые цифры, которые мы откинули, значит
и есть искомое
число.
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число R следующим образом.
1) Число N переводим в двоичную запись.
2) К этой записи справа дописывается один разряд по следующему правилу: если количество единиц в двоичной записи числа больше количества нулей, то справа дописывается 1, иначе дописывается 0.
3) К полученной записи повторно применяется алгоритм из п.2.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите наибольшее число R, меньшее 99, которое может быть получено в результате работы данного алгоритма. В ответе это число запишите в десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с
помощью функции bin, затем вычисляем количество единиц и нулей с помощью метода count. Если единиц
больше, дописываем 1, используя конкатенацию строк (оператор +). Иначе – дописываем 0. Повторяем те же
действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, меньше ли оно 99 и является ли наибольшим среди полученных. Если условие выполняется, обновляем наибольшее значение R. После завершения цикла выводим максимальное R, которое смогли найти.
mx = -1000 # Инициализация переменной для хранения максимального R < 99 for i in range(1, 1000): # Перебираем числа N от 1 до 999 включительно s = bin(i)[2:] # Перевод в двоичную систему # Вычисляем количество единиц и нулей, сравниваем if s.count("1") > s.count("0"): # Если единиц больше, дописываем 1, иначе - 0 s += "1" else: s += "0" # Повторяем предыдущий шаг, но уже для изменённой записи if s.count("1") > s.count("0"): s += "1" else: s += "0" r = int(s, 2) # Переводим в десятичную систему # Проверяем, что r < 99, то есть подходит по условию, и больше текущего максимального if r < 99 and r > mx: mx = r print(mx)
Аналитическое решение
Заметим, что алгоритм добавляет ту цифру, которых больше у числа (если количество равно, то добавляется нуль).
Если у числа было какое-то количество нулей и какое-то количество единиц, то добавляя какую-то цифру, их
количество только увеличивается, а значит и на следующем шаге добавят эту же цифру. Значит к числу добавят
или
.
Нам нужно найти наибольшее число , которое могли получить после работы данного алгоритма. Могло ли
получиться число
? Нет, так как оно кончается на 10, а мы знаем, что такое число не могло получиться
после этого алгоритма.
Могло ли получиться число ? Нет, так как оно кончается на 01, а мы знаем, что такое число не могло
получиться после этого алгоритма.
Могло ли получиться число ? Такое число могло получиться после этого алгоритма, но давайте
проверим какое число тогда было бы без добавленных нулей – если уберём два нуля, то получим число
, количество нулей больше, чем количество единиц, а значит к такому числу после работы алгоритма
действительно добавляются два нуля, а значит 96 это наибольшее
, которое могли получить после работы
алгоритма.
Ошибка.
Попробуйте повторить позже
На вход алгоритма "КХЪ" подаётся натуральное число Алгоритм строит по нему новое число
следующим
образом:
1. Строится двоичная запись числа
2. В конец двоичной записи дописываются две первые цифры этой записи в обратном порядке.
3. В начало двоичной записи дописывается единица.
4. Результат переводится в десятичную систему и выводится на экран.
Пример. Дано число Алгоритм работает следующим образом:
1. Двоичная запись числа
.
2. В конец записи добавляются цифры – первые две цифры в обратном порядке (сначала вторая, затем первая),
получается
.
3. В начало записи добавляется цифра , получается
.
4. На экран выводится число .
Полученная таким образом запись является искомым числом Укажите минимальное число
которое превышает
число
и может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе
счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа X необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число Y в двоичную строку с помощью
функции bin, затем дописываем в конец две первые цифры, находящиеся под индексами 0 и 1, в обратном порядке.
Следующим шагом добавляем 1 в начало. Переводим результат в десятичную систему счисления, получаем
X.
Далее организуем перебор чисел Y в цикле for. Для каждого полученного значения X проверяем, превышает ли оно 50 и является ли наименьшим среди полученных. Если условие выполняется, обновляем наименьшее значение X. После завершения цикла выводим минимальное X, которое > 50.
mn = 10 ** 10 # Инициализация переменной для хранения минимального X > 50 for y in range(2, 1000): # Перебираем числа N от 2 до 999 включительно s = bin(y)[2:] # Перевод в двоичную систему s += s[1] + s[0] # Дописываем первые две цифры в обратном порядке s = "1" + s # Дописываем 1 в начало x = int(s, 2) # Переводим в десятичную систему, получаем X # Проверяем, что X > 50, то есть подходит по условию, и меньше минимального if x > 50 and x < mn: mn = x print(mn)
Ошибка.
Попробуйте повторить позже
Автомат обрабатывает натуральное число по следующему алгоритму:
- Строится двоичная запись числа
.
- В конец двоичной записи добавляются две цифры:
— если
четное,
— если
нечетное.
- Результат переводится в десятичную систему, затем от числа отнимается минимальное количество бит,
которым можно закодировать
чисел.
- Полученное число выводится на экран.
Пример. Дано число Алгоритм работает следующим образом:
- Двоичная запись числа
- В конец добавляются цифры
, так как
— четное число. Получается
.
- Результат переводится в десятичную систему.
. От
отнимается число
, так как это минимальное количество бит, которым можно закодировать
чисел.
- На экран выводится 221.
Укажите минимальное , при котором автомат выведет на экран число
.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью
функции bin, затем вычисляем чётность N с помощью взятия остатка от деления на 2 (% 2). Если N – чётное, дописываем
11, используя конкатенацию строк (оператор +). Иначе – дописываем 00. Переводим результат в десятичную систему
счисления, вычитаем минимальное количество бит, которым можно закодировать N чисел. Для этого используем len(bin(N
- 1)[2:]), так как при кодировании чисел от 0 до N максимальное значение — это N - 1, и длина его двоичной записи
показывает минимальное количество бит.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, равно ли оно 126. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for n in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(n)[2:] # Перевод в двоичную систему if n % 2 == 0: # Если n - чётно, дописываем 11, иначе 00 s += "11" else: s += "00" """ Результат переводим в десятичную систему и вычитаем длину двоичной записи максимального значения (n - 1) чисел от 0 до N - 1 """ x = int(s, 2) - len(bin(n - 1)[2::]) if x == 126: # Сравниваем результат с 126 print(n) # Выводим ответ break # Завершаем цикл
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число . Алгоритм строит по нему новое число
следующим
образом.
- Строится двоичная запись числа
.
- К этой записи справа дописывается единица.
- Затем справа дописывается бит чётности:
, если в двоичном коде полученного числа чётное число единиц, и
, если нечётное.
- К полученному результату дописывается ещё один бит чётности.
Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа ) является двоичной
записью искомого числа
. Какое минимальное число
, большее
, может быть получено в результате работы
автомата?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью
функции bin, дописываем единицу. Затем вычисляем количество единиц с помощью метода count. Если это количество
чётное, дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же
действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 212 и является ли наименьшим среди полученных. Если условие выполняется, обновляем наименьшее значение R. После завершения цикла выводим минимальное R, которое > 212.
mn = 10 ** 10 # Инициализация переменной для хранения минимального R > 212 for i in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(i)[2:] # Перевод в двоичную систему s += ’1’ # Дописываем единицу # Вычисляем бит чётности if s.count("1") % 2 == 0: # Если количество единиц чётно, дописываем 0, иначе - 1 s += "0" else: s += "1" # Повторяем предыдущий шаг, но уже для изменённой записи if s.count("1") % 2 == 0: s += "0" else: s += "1" r = int(s, 2) # Переводим в десятичную систему, получаем R # Проверяем, что r > 212, то есть подходит по условию, и меньше текущего минимального if r > 212 and r < mn: mn = r print(mn)
Аналитическое решение:
Каким бы не было число, на втором шаге к нему всегда дописывается единица, так что давайте называть это число «изначальным».
Если изначальное число имеет чётное количество единиц, то после добавления нуля количество единиц не
изменится, а потому на следующем шаге также добавится ноль. Итого к числу допишут два нуля.
Если изначально число имеет нечётное количество единиц, то после добавления единицы количество единиц
увеличится на
, что означает, что количество единиц станет чётным числом, а значит на следующем шаге уже будут
добавлять ноль. Итого к числу допишут единицу и ноль.
Значит мы будем проверять только числа, которые кончаются на или
.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? В двоичной СС оно выглядит как
. Так что вполне возможно. Если
откинем последние три цифры, то у нас останется число
, добавим к нему единицу и получим число
, у
него чётное число единиц, а значит после работы алгоритма к нему дописали бы два нуля, но мы откинули
, а значит
это не то число, которое нам нужно.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? В двоичной СС оно выглядит как
. Так что вполне возможно. Если
откинем последние три цифры, то у нас останется число
, добавим к нему единицу и получим число
, у
него нечётное число единиц, а значит после работы алгоритма к нему дописали бы единицу и ноль, но мы откинули
, а
значит это не то число, которое нам нужно.
Могло ли получиться число ? Нет, в двоичной СС оно выглядит как
, а значит получиться после
алгоритма не могло.
Могло ли получиться число ? В двоичной СС оно выглядит как
. Так что вполне возможно. Если
откинем последние три цифры, то у нас останется число
, добавим к нему единицу и получим число
, у
него нечётное число единиц, а значит после работы алгоритма к нему дописали бы единицу и ноль, а мы откинули как раз
, значит
– это интересующее нас число.
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число . Алгоритм строит по нему новое число
следующим
образом.
- Строится двоичная запись числа
.
- К этой записи дописывается (дублируется) последняя цифра.
- Затем справа дописывается
, если в двоичном коде числа
чётное число единиц, и
, если нечётное.
- К полученному результату справа дописывается
, если количество единиц получившегося числа нечётно, иначе дописывается
.
Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа ) является двоичной
записью искомого числа
. Укажите минимальное число
, после обработки которого автомат получает число, большее
. В ответе это число запишите в десятичной системе.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с
помощью функции bin, дописываем последнюю цифру, которая имеет индекс -1 (первая с конца). Затем
вычисляем количество единиц изначальной записи с помощью метода count. Если это количество чётное,
дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же
действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 120. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for n in range(1, 1000): # Перебираем числа N от 1 до 999 включительно r = bin(n)[2:] # Перевод в двоичную систему r += r[-1] # Дублируем последнюю цифру # Вычисляем количество единиц изначальной (!) записи if bin(n)[2:].count("1") % 2 == 0: # Если количество единиц чётно, дописываем 0, иначе - 1 r += "0" else: r += "1" # Повторяем предыдущий шаг, но уже для изменённой записи if r.count("1") % 2 == 0: r += "0" else: r += "1" if int(r, 2) > 120: # Получаем R # Первое выведенное N будет минимальным print(n) # Выводим N break # Завершаем цикл
Ошибка.
Попробуйте повторить позже
Автомат Алиса-007 обрабатывает натуральное число N по следующему алгоритму:
1) Строится двоичная запись числа N.
2) Запись «переворачивается», то есть читается справа налево. Если при этом появляются ведущие нули, они отбрасываются.
3) Полученное число переводится в десятичную запись и выводится на экран. Какое наименьшее число, превышающее 765, после обработки автоматом даёт результат 23?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью
функции bin. Затем переворачиваем строку, используя срез с шагом -1, избавляемся от ведущих нулей, применяя
функцию int. Далее снова приводим к строке, чтобы перевести двоичную запись в десятичный вид, используя
int.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения проверяем, равняется ли оно 23. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N > 765, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for i in range(766, 10000000): # Перебираем числа N > 765 s = bin(i)[2:] # Перевод в двоичную систему s = str(int(s[::-1])) # Переворачиваем двоичную запись (s[::-1]), # избавляемся от незначащих нулей (int), приводим к строке (str) if int(s, 2) == 23: # Проверяем, что получили 23 print(i) # Выводим N break # Завершаем цикл
Ошибка.
Попробуйте повторить позже
Автомат обрабатывает натуральное число по следующему алгоритму:
1) Строится восьмибитная двоичная запись числа .
2) Инвертируются разряды исходного числа (0 заменяется на 1, 1 на 0).
3) К полученному двоичному числу прибавляют единицу.
4) Полученное число переводится в десятичную систему счисления.
Для какого числа N результат работы алгоритма равен 130?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin, при чём нас интересует восьмибитная двоичная запись, в ней всегда 8 символов, если меньше - нужно
добавить в начало нули (например, 111 -> 00000111). Количество необходимых нулей вычисляется по формуле: 8 - длина
двоичной записи. Далее создаём пустую строку, в которой сохраним инвертированное число. Проходимся по каждой цифре
двоичной записи, если встретили 1, добавляем в новую строку 0 и наоборот. Единицу удобнее добавить после
перевода в десятичную запись, так и сделаем, после чего сравним полученное число с 130 и выведем N, если это
так.
for i in range(1, 128): # Перебор значений N от 1 до 127 s = "0" * (8 - len(bin(i)[2::])) + bin(i)[2::] # Добавляем необходимое количество нулей в начало, чтобы запись имела 8 бит (цифр) x = "" # Строка для хранения инвертированной записи for j in range(len(s)): # Проходимся по каждому индексу if s[j] == "1": # Получаем цифру по индексу j и сравниваем с 1 # Если встречаем 1, добавляем 0 и наоборот x += "0" else: x += "1" if (int(x, 2) + 1) == 130: # Добавляем единицу и сравниваем с нужным числом print(i) # Выводим ответ
Аналитическое решение:
Необходимо найти такое , что после работы алгоритма мы получим 130. Давайте размотаем алгоритм с конца: в
конце алгоритм добавляет единицу, а значит отнимём её и получим число
. В 2 СС это число выглядит так
. Инвертируем биты обратно, получим число
, ведущий ноль не отбрасываем, так как алгоритм
строил восьмибитную(то есть состояющую из 8 цифр в двоичной СС) запись. Значит изначальное число равнялось
.
Ошибка.
Попробуйте повторить позже
Автомат обрабатывает натуральное число
по следующему алгоритму:
- Строится восьмибитная двоичная запись числа
.
- Удаляется последняя цифра двоичной записи.
- Запись «переворачивается», то есть читается справа налево.
- Полученное число переводится в десятичную запись и выводится на экран.
Каково наименьшее число, меньшее , которое после обработки автоматом не изменится?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с
помощью функции bin, при чём нас интересует восьмибитная двоичная запись, в ней всегда 8 символов,
если меньше - нужно добавить в начало нули (например, 111 -> 00000111). Количество необходимых нулей
вычисляется по формуле: 8 - длина двоичной записи. Далее избавляемся от последней цифры, используя срез,
переворачиваем запись при помощи среза с шагом -1. Осталось перевести результат в десятичную систему
счисления.
Далее организуем перебор чисел N < 100 в цикле for. Для каждого полученного значения проверяем, равняется ли оно изначальному. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
for i in range(1, 100): # Перебор значений N < 100 s = "0" * (8 - len(bin(i)[2:])) + bin(i)[2:] # Добавляем необходимое количество нулей в начало, чтобы запись имела 8 бит (цифр) s = s[:len(s) - 1] # Избавляемся от последней цифры s = s[::-1] # Переворачиваем запись if int(s, 2) == i: # Сравниваем результат с изначальным числом print(i) # Выводим N break # Завершаем цикл, прекращаем поиск
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число
следующим образом:
- Строится двоичная запись числа
.
- В этой записи последний встречаемый ноль заменяется на первые две цифры полученной записи. Если нуля нет в записи числа, алгоритм аварийно завершается.
- Запись записывается справа налево (в обратную сторону).
- Результат переводится в десятичную систему счисления.
Для скольких значений в результате работы алгоритма получится число
?
Решение 1
В этой задаче нам нужно определить количество чисел N, для которых алгоритм преобразования двоичной записи даёт результат 255. Сначала мы организуем перебор всех чисел N, начиная с 2 и до некоторого верхнего предела (в данном случае 10000) с помощью цикла for i in range(2, 10000). Для каждого числа мы строим его двоичную запись с помощью bin(i)[2:]. Здесь bin(i) возвращает строку вида ’0b...’, поэтому мы срезаем первые два символа ’0b’, чтобы получить только последовательность нулей и единиц, которую присваиваем переменной s.
Далее мы проверяем, содержит ли двоичная запись хотя бы один ноль с помощью условия if s.count(’0’) > 0:. Если нуля нет, алгоритм должен аварийно завершаться, поэтому мы просто пропускаем такие числа. Если нули есть, то нам необходимо найти индекс последнего нуля в записи. Для этого мы перебираем индексы строки в обратном порядке с помощью for j in range(len(s) - 1, -1, -1) и останавливаемся на первом встреченном нуле, сохраняя его индекс в переменной ind.
После нахождения последнего нуля мы формируем новую строку x, где на месте этого нуля вставляем первые две цифры исходной двоичной записи s[0] и s[1], используя конструкцию x = s[:ind] + s[0] + s[1] + s[ind + 1:]. Далее строку x разворачиваем справа налево с помощью среза x[::-1]. Полученную обратную запись переводим в десятичное число с помощью int(x, 2) и сравниваем с целевым результатом 255. Если совпадение есть, увеличиваем счётчик ans на 1. В конце выводим общее количество подходящих чисел с помощью print(ans).
# Инициализируем счётчик подходящих чисел ans = 0 # Перебираем все числа N от 2 до 9999 включительно for i in range(2, 10000): # Получаем двоичную запись числа N без префикса ’0b’ s = bin(i)[2:] # Проверяем, есть ли в записи хотя бы один ноль if s.count(’0’) > 0: # Инициализируем переменную для индекса последнего нуля ind = ’’ # Перебираем индексы строки в обратном порядке, чтобы найти последний ноль for j in range(len(s) - 1, -1, -1): if s[j] == ’0’: # Сохраняем индекс последнего нуля и выходим из цикла ind = j break # Формируем новую строку: заменяем найденный ноль первыми двумя цифрами исходной записи x = s[:ind] + s[0] + s[1] + s[ind + 1:] # Разворачиваем строку справа налево x = x[::-1] # Переводим результат обратно в десятичную систему и проверяем, равен ли он 255 if int(x, 2) == 255: # Если да, увеличиваем счётчик подходящих чисел ans += 1 # Выводим общее количество чисел, удовлетворяющих условию print(ans)
Решение 2
Сначала мы организуем перебор всех чисел N от 2 до некоторого верхнего предела (в данном случае 10000) с помощью цикла for i in range(2, 10000). Для каждого числа строим его двоичную запись с помощью bin(i)[2:]. Здесь функция bin(i) возвращает строку вида ’0b...’, поэтому срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц, которую мы сохраняем в переменной s.
Далее проверяем, встречается ли в двоичной записи хотя бы один ноль с помощью if s.count(’0’) > 0:. Если ноля нет, алгоритм должен аварийно завершаться, поэтому такие числа пропускаем. Если ноль есть, мы разворачиваем строку s справа налево с помощью s[::-1] и применяем метод replace(’0’, s[0:2][::-1], 1), который заменяет первый встреченный ноль в развёрнутой строке на первые две цифры исходной записи в обратном порядке. Это позволяет реализовать условие задачи о замене последнего нуля оригинальной записи на первые две цифры. После этого получаем итоговую строку двоичной записи, которую переводим в десятичную систему с помощью int(s, 2) и сравниваем с целевым значением 255. Если результат совпадает, увеличиваем счётчик ans на 1. После окончания цикла выводим общее количество подходящих чисел с помощью print(ans).
# Инициализируем счётчик подходящих чисел ans = 0 # Перебираем все числа N от 2 до 9999 включительно for i in range(2, 10000): # Получаем двоичную запись числа N без префикса ’0b’ s = bin(i)[2:] # Проверяем, есть ли в записи хотя бы один ноль if s.count(’0’) > 0: # Разворачиваем строку справа налево и заменяем первый встреченный ноль # на первые две цифры исходной двоичной записи, взятые в обратном порядке s = s[::-1].replace(’0’, s[0:2][::-1], 1) # Переводим полученную строку в десятичное число и проверяем, равно ли оно 255 if int(s, 2) == 255: # Если результат совпадает, увеличиваем счётчик подходящих чисел ans += 1 # Выводим общее количество чисел, удовлетворяющих условию print(ans)
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число
следующим образом:
- Строится двоичная запись числа
.
- В конец записи (справа) дописывается конъюнкция двух правых крайних цифр двоичной записи числа
.
- В конец записи (справа) дописывается конъюнкция двух левых крайних цифр двоичной записи числа
.
- Результат переводится в десятичную систему.
Пример. Дано число . Алгоритм работает следующим образом:
- Двоичная запись числа
.
- Конъюнкция двух правых крайних цифр
, новая запись
.
- Конъюнкция двух левых крайних цифр
, новая запись
.
- Результат работы алгоритма
.
При каком наименьшем числе в результате работы алгоритма получится
? В ответе запишите это число в
десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с
помощью функции bin. Важно отметить, что s - строка, поэтому нужно перевести в число (тип int), чтобы
операция & сработала. Получив результат конъюнкции, приведём его к строке, чтобы дописать в конец,
используя конкатенацию (оператор +). Осталось перевести результат в десятичную систему счисления, получив
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 55. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.
# Перебираем числа N от 2 до 9999 включительно for n in range(2, 10000): s = bin(n)[2:] # Перевод в двоичную систему s += str(int(s[-1]) & int(s[-2])) # Дописываем конъюнкцию двух последних цифр s += str(int(s[0]) & int(s[1])) # Дописываем конъюнкцию двух первых цифр # Переводим R в десятичную систему и проверяем условие R > 55 if int(s, 2) > 55: print(n) # выводим N break # завершаем цикл
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число . Алгоритм строит по нему новое число
следующим
образом.
- Строится двоичная запись числа
.
- Складываются все цифры двоичной записи, и остаток от деления суммы цифр на
дописывается в конец числа (справа). Например, запись
преобразуется в запись
;
- Шаг
повторяется еще один раз. Например, запись
преобразуется в запись
;
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа ) является двоичной
записью искомого числа
.
Укажите минимальное число , которое превышает
и может являться результатом работы алгоритма. В ответе
это число запишите в десятичной системе.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и
более нет. Используя метод count, вычисляем сумму цифр, находим остаток от деления на 2 (% 2), дописываем в конец
записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. Осталось перевести результат в
десятичную систему счисления, получив R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 166 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.
mn = 10 ** 10 # Инициализация переменной для хранения минимального R > 166 for n in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(n)[2:] # Перевод в двоичную систему # Считаем количество единиц (сумму цифр) с помощью count, # находим остаток (% 2), дописываем в конец s s = s + str(s.count("1") % 2) s = s + str(s.count("1") % 2) # Повторяем для обновлённой записи r = int(s, 2) # Переводим в десятичную систему # Проверяем, что r > 166, то есть подходит по условию, и меньше минимального if r > 166 and r < mn: mn = r print(mn)
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число . Алгоритм строит по нему новое число
следующим
образом.
- Строится двоичная запись числа
.
- Складываются все цифры полученной двоичной записи. В конец записи (справа) дописывается остаток от
деления суммы цифр на
.
- Предыдущий пункт повторяется для записи с добавленной цифрой.
- Результат переводится в десятичную систему и выводится на экран.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа ) является двоичной
записью искомого числа
.
Укажите такое наименьшее число , которое превышает
и может являться результатом работы этого алгоритма.
В ответе это число запишите в десятичной системе счисления.
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и
более нет. Используя метод count, вычисляем сумму цифр, находим остаток от деления на 2 (% 2), дописываем в конец
записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. Осталось перевести результат в
десятичную систему счисления, получив R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 50 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.
mn = 10 ** 10 # Инициализация переменной для хранения минимального R > 50 for n in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(n)[2:] # Перевод в двоичную систему # Считаем количество единиц (сумму цифр) с помощью count, # находим остаток (% 2), дописываем в конец s s = s + str(s.count("1") % 2) s = s + str(s.count("1") % 2) # Повторяем для обновлённой записи r = int(s, 2) # Переводим в десятичную систему # Проверяем, что r > 50, то есть подходит по условию, и меньше минимального if r > 50 and r < mn: mn = r print(mn)
Ошибка.
Попробуйте повторить позже
Автомат обрабатывает натуральное число по следующему алгоритму:
- Строится двоичная запись числа
.
- Складываются все цифры полученной двоичной записи. В конец записи (справа) дописывается остаток от
деления суммы на
.
- Предыдущий пункт повторяется для записи с добавленной цифрой.
- Результат переводится в десятичную систему и выводится на экран.
Пример. Дано число . Алгоритм работает следующим образом:
- Двоичная запись числа
.
- Сумма цифр двоичной записи
, остаток от деления на
равен
, новая запись
.
- Сумма цифр полученной записи
, остаток от деления на
равен
, новая запись
.
- На экран выводится число
.
Какое наименьшее число, большее , может появиться на экране в результате работы автомата?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью
функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так
как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр (количество единиц), находим
остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк. Повторяем то же
самое для обновлённой записи. Осталось перевести результат в десятичную систему счисления, получив
R.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 1024 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.
mn = 10 ** 10 # Инициализация переменной для хранения минимального R > 1024 for n in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(n)[2:] # Перевод в двоичную систему # Считаем количество единиц (сумму цифр) с помощью count, # находим остаток (% 2), дописываем в конец s s = s + str(s.count("1") % 2) s = s + str(s.count("1") % 2) # Повторяем для обновлённой записи r = int(s, 2) # Переводим в десятичную систему # Проверяем, что r > 1024, то есть подходит по условию, и меньше минимального if r > 1024 and r < mn: mn = r print(mn)
Ошибка.
Попробуйте повторить позже
Автомат обрабатывает натуральное число N по следующему алгоритму:
1. Строится двоичная запись числа .
2. Складываются все цифры полученной двоичной записи. В конец записи (справа) дописывается остаток от деления
полученной суммы на .
3. Предыдущий пункт повторяется для записи с добавленной цифрой.
4. Результат переводится в десятичную систему и выводится на экран.
Пример. Дано число . Алгоритм работает следующим образом:
1. Двоичная запись числа .
2. Сумма цифр двоичной записи , остаток от деления на
равен
, новая запись
.
3. Сумма цифр полученной записи , остаток от деления на
равен
, новая запись
.
4. На экран выводится число .
Какое наименьшее число, большее вашего балла на ЕГЭ (), может появится на экране в результате работы
автомата?
Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа необходимо «перевести» этот алгоритм с
естественного языка на язык программирования Python. Первым делом переводим число N в двоичную
строку с помощью функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством
единиц в ней, так как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр (количество
единиц), находим остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк.
Повторяем то же самое для обновлённой записи. В завершение переводим результат в десятичную систему
счисления.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения проверяем, превышает ли оно 100 и является ли минимальным среди полученных. Если условие выполняется, обновляем наименьшее значение. После завершения цикла выводим минимальный результат работы алгоритма, больший 100.
mn = 10 ** 10 # Инициализация переменной для хранения минимального результата > 100 for n in range(1, 10000): # Перебираем числа N от 1 до 9999 включительно s = bin(n)[2:] # Перевод в двоичную систему # Считаем количество единиц (сумму цифр) с помощью count, # находим остаток (% 2), дописываем в конец s s = s + str(s.count("1") % 2) s = s + str(s.count("1") % 2) # Повторяем для обновлённой записи r = int(s, 2) # Переводим в десятичную систему # Проверяем, что результат > 100, то есть подходит по условию, и меньше минимального if r > 100 and r < mn: mn = r print(mn)
Аналитическое решение:
Имеется число . Все числа в двоичной записи складываются и добавляется остаток от деления на 2 этой суммы, то
есть цифра 0 или 1, значит если сумма чётна, то дописываем 0, иначе 1. Если мы дописали единичку, то количество единиц
увеличится на 1, а значит, что после этого сумма будет чётна, и уже в следующем пункте мы допишем нолик. Если мы
дописали ноль, то сумма числа не меняется, а значит в следующем пункте мы также допишем нолик. Значит число в 2 СС
заканчивается на 00 или 10.
Нам необходимо найти число, большее, чем 100, которое в 2 СС заканчивается на 00 или 10. Будем перебирать с минимального.
Подойдет ли число ? Нет, оно кончается на 01.
Подойдет ли число ? Да, так как оно заканчивается на 10. Значит это и есть наш ответ.
Ошибка.
Попробуйте повторить позже
МС получает на вход натуральное число и строит по нему новое число
следующим образом:
- Строится двоичная запись числа
.
- Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется цифра, которая встречается реже.
- Шаг
повторяется еще два раза.
- Результат переводится в десятичную систему счисления.
При каком наибольшем исходном числе в результате работы алгоритма получается нечетное число, которое
делится на
?
Решение 1
В этой задаче мы рассматриваем алгоритм, который строит новое число на основе двоичной записи исходного числа N и выполняет последовательное добавление битов в конец строки по определённым правилам. Сначала мы организуем перебор всех чисел N от 1023 вниз до 2 с помощью цикла for i in range(1023, 1, -1). Для каждого числа создаём его двоичную запись с помощью bin(i)[2:]. Здесь функция bin(i) возвращает строку вида ’0b...’, поэтому срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц, которую сохраняем в переменной s.
Далее мы трижды повторяем шаг добавления нового бита: проверяем количество нулей и единиц в текущей строке s с помощью s.count(’0’) и s.count(’1’). Если количество нулей и единиц одинаково, добавляем в конец строки её последнюю цифру s[-1]. Если количество нулей меньше количества единиц, в конец добавляем ’0’, а если единиц меньше, добавляем ’1’. Для компактности решения используется комбинация логических выражений с умножением строк: s[-1] * (s.count(’0’) == s.count(’1’)) добавляет последнюю цифру при равенстве чисел нулей и единиц, а ’1’ * (s.count(’1’) < s.count(’0’)) + ’0’ * (s.count(’0’) < s.count(’1’)) добавляет реже встречающийся бит. Этот блок повторяется три раза, что реализует требование "Шаг 2 повторяется еще два раза".
После трёх итераций получаем финальную двоичную запись, которую преобразуем в десятичное число с помощью int(s, 2). Проверяем два условия: число должно быть нечётным (% 2 != 0) и делиться на 7 (% 7 == 0). Как только находится первое число, удовлетворяющее обоим условиям (так как мы перебираем числа в порядке убывания, оно будет наибольшим), выводим его с помощью print(i) и прерываем цикл командой break.
# Перебор чисел N от 1023 вниз до 2 включительно for i in range(1023, 1, -1): # Получаем двоичную запись числа без префикса ’0b’ s = bin(i)[2:] # str: последовательность нулей и единиц # Трижды добавляем бит в конец строки по правилу задачи # Если количество нулей и единиц одинаково, добавляем последнюю цифру # Иначе добавляем бит, который встречается реже s += s[-1] * (s.count(’0’) == s.count(’1’)) + \ ’1’ * (s.count(’1’) < s.count(’0’)) + \ ’0’ * (s.count(’0’) < s.count(’1’)) s += s[-1] * (s.count(’0’) == s.count(’1’)) + \ ’1’ * (s.count(’1’) < s.count(’0’)) + \ ’0’ * (s.count(’0’) < s.count(’1’)) s += s[-1] * (s.count(’0’) == s.count(’1’)) + \ ’1’ * (s.count(’1’) < s.count(’0’)) + \ ’0’ * (s.count(’0’) < s.count(’1’)) # Преобразуем итоговую двоичную запись в десятичное число # и проверяем, что число нечётное и делится на 7 if int(s, 2) % 2 != 0 and int(s, 2) % 7 == 0: # Если условия выполнены, выводим наибольшее исходное число print(i) break
Решение 2
Сначала мы организуем перебор всех чисел N от 1023 до 2 включительно с помощью цикла for i in range(1023, 1, -1). Мы начинаем с 1023, чтобы сразу находить наибольшее подходящее число, и двигаемся вниз. Для каждого числа создаём его двоичную запись с помощью функции bin(i)[2:]. Здесь bin(i) возвращает строку вида ’0b...’, а срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц. Эта строка сохраняется в переменной s.
Далее мы три раза повторяем шаг модификации строки, как требует условие задачи: считаем количество единиц и нулей в текущей записи с помощью s.count(’1’) и s.count(’0’), а затем находим разницу k = s.count(’1’) - s.count(’0’). Если разница отрицательна (k < 0), это значит, что нулей больше, и в конец строки добавляем ’1’, то есть бит, который встречается реже. Если разница положительна (k > 0), единиц больше, и в конец добавляем ’0’. Если разница равна нулю (k == 0), количество единиц и нулей одинаково, и в конец добавляем последнюю цифру текущей строки s[-1]. Мы выполняем эту операцию три раза, чтобы учесть три шага добавления бита.
После трёх итераций получаем финальную двоичную строку, которую преобразуем в десятичное число с помощью int(s, 2). Проверяем два условия одновременно: число должно быть нечётным (% 2 != 0) и делиться на 7 (% 7 == 0). Поскольку мы перебираем числа сверху вниз, как только находим число, удовлетворяющее обоим условиям, оно будет наибольшим, и мы выводим его с помощью print(i), после чего прерываем цикл командой break.
# Перебор чисел N от 1023 вниз до 2 включительно for i in range(1023, 1, -1): # Получаем двоичную запись числа без префикса ’0b’ s = bin(i)[2:] # str: последовательность нулей и единиц # Повторяем три раза добавление нового бита по правилу задачи for j in range(3): # Вычисляем разницу между количеством единиц и нулей k = s.count(’1’) - s.count(’0’) # Если единиц меньше нулей, добавляем ’1’ в конец if k < 0: s += ’1’ # Если единиц больше нулей, добавляем ’0’ в конец elif k > 0: s += ’0’ # Если единиц и нулей поровну, добавляем последнюю цифру строки else: s += s[-1] # Преобразуем итоговую двоичную запись в десятичное число # и проверяем, что число нечётное и делится на 7 if int(s, 2) % 2 != 0 and int(s, 2) % 7 == 0: # Если условия выполнены, выводим наибольшее исходное число print(i) break
Ошибка.
Попробуйте повторить позже
На вход алгоритма подаётся натуральное число . Алгоритм строит по нему новое число
следующим
образом.
1) Строится двоичная запись числа .
2) Эта запись изменяется по следующим правилам:
Если сумма цифр в двоичной записи числа четная, то справа дописывается , а первые два левых разряда заменяются
на
;
Если сумма цифр в двоичной записи числа нечетная, то справа дописывается , а первые два левых разряда
заменяются на
;
Например, запись преобразуется в
.
Полученная таким образом запись (в ней на один разряд больше, чем в записи исходного числа ) является двоичной
записью искомого числа
.
Укажите максимальное число , для которого результат работы алгоритма меньше
. В ответе это число запишите
в десятичной системе.
Решение программой
В условии задачи описан алгоритм, для поска подходящего числа N необходмо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью bin(), затем находим количество единиц в числе с помощью метода count() и проверяем чётность этого количества. Если количество чётное, то к срезу со 2 символа исходной двоичной записи слева приписываем 10, а справа 0, используя конкатенацию строк (оператор +). Если нечётное, то к срезу со 2 символа исходной двоичной записи слева приписываем 11, а справа 1.
Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, не превышает ли оно 24 и выводим исходное N. В качестве ответа выбираем наибольшее из подходящих N.
for n in range(2, 24): # Перебор всех чисел N от 2 до 23 x = bin(n)[2:] # Получаем двоичную запись N (без префикса ’0b’) if x.count("1") % 2 == 0: # Если количество единиц четное, x = "10" + x[2:] + "0" # Заменяем первые две цифры слева на 10 и справа приписываем 0 else: # Иначе x = "11" + x[2:] + "1" # Заменяем первые две цифры слева на 11 и справа приписываем 1 if int(x, 2) < 24: # Преобразуем полученную двоичную строку в десятичное число R и проверяем условие print(n) # Выводим подходящие N