Привет! В этой статье будут различные примеры решения задач из 5-ого задания ЕГЭ по информатике 2022.
Задание 5 решается не сложно, но, как всегда, нужно потренироваться решать подобные задачи, чтобы уверенно себя чувствовать на ЕГЭ по информатике 2022.
Рассмотрим классический пример.
Задача (Классическая)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R по следующему принципу.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу:
а) Складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописываются в конец числа (справа). Например, запись 11100 преобразуется в запись 111001.
б) Над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите минимальное число R, которое превышает 42 и может являться результатом работы алгоритма. В ответе это число запишите в десятичной системе.
Решение:
Решение на Python.
for n in range(1, 1000): s=format(n, 'b') s=s+str(s.count('1')%2) s=s+str(s.count('1')%2) r=int(s, 2) if r>42: print(r)
Программа будет выводить различные числа, но нас интересует самое маленькое. В ответе получается 46. Чтобы остановить поток чисел, можно нажать сочетание Ctrl + C.
В программе перебираем натуральные числа от 1 до 1000 с помощью цикла for. Каждое число подставляем в описанный алгоритм, в надежде получить в результате число r, удовлетворяющие условию задачи.
С помощью функции format переводим число n в двоичный вид. Получаем результат в виде строки s.
Чтобы найти сумму цифр получившейся двоичной записи, достаточно подсчитать количество единиц в строке s. Ведь только единицы в двоичной записи дают в сумму результат. Это можно сделать, применив функцию .count() к строке s.
Добавляем справа к строке s остаток от деления суммы цифр на 2. Остаток нужно превратить в строковый тип данных, чтобы «присоединить» к строке s справа.
Повторяем пункт Б, скопировав строку с пунктом А.
Чтобы обратно превратить строку двоичной записи в десятичное число, используем функцию int(), указав параметр 2.
В конце программы пропишем условие. Если r больше 42, то будем печатать эти значения. Остаётся выбрать минимальное число r.
Решение с помощью рассуждений.
Алгоритму на вход приходит обычное натуральное число N.
Это число преобразуется в двоичную запись (пункт 1).
Во втором пункте правил формирования нового числа сказано, что к числу, полученному в первом пункте, дописываются справа ещё два дополнительных разряда.
Про 1 дополнительный разряд указано в подпункте а): «Складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописываются в конец числа (справа). Например, запись 11100 преобразуется в запись 111001.»
Если по простому сказать, то мы подсчитываем количество единиц в двоичном представлении числа N. Если количество единиц чётное, то пишем в 1 дополнительный разряд ноль, если нечётное, то пишем в 1 дополнительный разряд единицу.
Со вторым дополнительным разрядом происходит всё тоже самое, что и с первым разрядом, только когда подсчитываем количество единиц, мы так же подсчитываем и в 1-ом дополнительном разряде.
В вопросе просят указать входящее наименьшее число N, чтобы автомат выдал число R больше 42.
Возьмём наименьшее число, которое больше 42 (т.е. 43) и переведём его в двоичную систему. Это можно сделать с помощью стандартного windows калькулятора.
Вызываем калькулятор, выбираем Вид->Программист. Кликаем на отметку Dec (это означает, что мы находимся в десятичной системе) и набираем число 43. Затем кликаем на отметку Bin
Проверим число 1010112. Может ли оно быть результатом работы нашего алгоритма?
Отделяем два дополнительных разряда справа. У нас, не считая двух дополнительных разрядов, количество единиц равно двум. Количество чётное, значит, в первом дополнительном разряде должен стоять 0. А у нас стоит 1.
Следовательно, число 1010112 не может являться результатом работы алгоритма. И это число не подходит.
Проверим последующие числа. На калькуляторе можно прибавлять по 1 и получать следующее число в двоичной системе. Мы проверяем последовательно числа, чтобы не пропустить самое маленькое число.
Подходит число 1011102. Количество единиц без двух дополнительных разрядов равно трём. Число нечётное. Значит, в первом дополнительном разряде должна стоять 1. В этом числе как раз стоит 1.
Количество единиц вместе с дополнительным разрядом равно 4. Число чётное, значит, во втором дополнительном разряде должен стоять 0. У нас и стоит во втором дополнительном разряде 0. Следовательно, число 1011102 подходит по всем правилам и является наименьшим.
В десятичной системе это число 46.
Ответ: 46
Рассмотрим ещё одну интересную задачу для подготовки к ЕГЭ по информатике 2022.
Задача(Замена символов)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1) Строится двоичная запись числа N.
2) Каждый разряд этой записи заменяется двумя разрядами по следующему правилу: если в разряде стоит 0, то вместо него пишется 01; если в разряде стоит 1, то 1 заменяется на 10.
Например, двоичная запись 1010 числа 10 будет преобразована в 10011001.
Полученная таким образом запись (в ней в два раза больше разрядов, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите максимальное нечётное число R, меньшее 256, которое может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе.
Решение:
Решение на Python.
for n in range(1, 1000): s=format(n, 'b') s2='' for x in s: if x=='0': s2 = s2 + '01' else: s2 = s2 + '10' r=int(s2, 2) if r%2!=0 and r<256: print(r)
Получается наибольшее число 169.
Здесь после того, как построена строка, содержащая двоичную запись числа n, мы с помощью цикла for перебираем каждый символ и анализируем его.
Предварительно создав переменную s2 для новой строки, мы записываем в неё ’01’, если анализируемый символ является нулём, и ’10’, если единицей.
Добавляем заменённые символы справа к строке s2, таким образом, самый первые символы окажутся постепенно слева, как положено.
Далее, делаем, как в прошлой задаче.
Решение с помощью рассуждений.
В этой задаче в начале строится двоичная запись числа N.
Каждый разряд превращается в два разряда! Единица превращается в 10. Ноль превращается в 01. На рисунке показан пример, как будет преобразовано число 10 = 10102.
Оценим первое число, которое меньше, чем 256. Это число 255.
255 = 111111112
Здесь количество разрядов равно 8. Это чётное число, значит, такое количество разрядов может быть в результате работы алгоритма. Только чётное количество разрядов может получится в результате работы алгоритма.
В старших двух разрядах должны быть цифры 10, т.к. исходное число N не может начинаться с нуля.
В остальных парах попробуем написать 10, чтобы число было как можно больше.
Получается, что число 101010102 удовлетворяет всем правилам алгоритма, является наибольшим, и оно меньше 256.
Но важный момент, нас просили в ответ записать нечётное число.
В двоичной системе число, которое оканчивается на ноль, является чётным.
В двоичной системе число, которое оканчивается на единицу, является нечётным.
Чтобы число было нечётным, изменим последние разряды на 01.
101010012 = 169
Ответ: 169
Набираем обороты в решении 5 задания из ЕГЭ по информатике 2022.
Задача(Классическая, закрепление)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу: если N чётное, в конце числа справа дописываются два нуля, в противном случае справа дописываются две единицы. Например, двоичная запись 1101 будет преобразована в 110111.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа — результата работы данного алгоритма.
Укажите минимальное число N, для которого результат работы алгоритма будет больше 130. В ответе это число запишите в десятичной системе счисления.
Решение:
Решение на Python.
for n in range(1, 1000): s=format(n, 'b') if n%2==0: s=s+'00' else: s=s+'11' r=int(s, 2) if r>130: print(n)
Минимальное число n получается 33.
Обратите внимание, что здесь уже анализируем число n. Если оно чётное, то к переменной s справа дописываем ’00’, иначе ’11’. Так же в этой задаче мы печатаем в ответе само число n.
Решение с помощью рассуждений.
После перевода в двоичную систему исходного числа N, алгоритм строит новое число по следующему правилу:
Бордовым прямоугольником показаны дополнительные разряды.
Нужно найти минимальное число больше 130. Будем проверять последовательно числа, начиная с 131.
Подходит число 135. В ответе нужно указать число N. Отбросим от числа 100001112 дополнительные разряды и переведём в десятичную систему.
1000012 = 33
Ответ: 33
Похожие задачи встречались в сборнике С. С. Крылова для подготовке к ЕГЭ по информатике.
Задача (Крепкий орешек)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Из числа N вычитается остаток от деления N на 4.
2. Строится двоичная запись полученного результата.
3. К это записи справа дописываются ещё два дополнительных разряда по следующему правилу:
а) Складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописываются в конец числа (справа). Например, запись 11100 преобразуется в запись 111001.
б) Над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2.
Полученная таким образом запись является двоичной записью числа R.
Укажите наибольшее число N, для которого результат работы данного алгоритма меньше 47. В ответе число N укажите в десятичной системе.
Решение:
Первый способ. Число R должно быть меньше 47. Переведём число 46 в двоичную систему.
46 = 1011102
Результат от второго пункта не должен превышать 10112. Если результат от второго пункта будет превышать это число, то после добавления дополнительных разрядов получится число R, которое не меньше 47.
Проверим число 10112 = 11. Видим, что это число не может являться результатом пункта 2.
11 + 0 = 11 (остаток при делении 11 на 4 равен 3) —
11 + 1 = 12 (остаток при делении 12 на 4 равен 0) —
11 + 2 = 13 (остаток при делении 13 на 4 равен 1) —
11 + 3 = 14 (остаток при делении 13 на 4 равен 2) —
Здесь мы перебираем все остатки при делении на 4. Чтобы число 11 могло являться результатом пункта 2, число, помеченное зелёным цветом, должно совпадать с числом, помеченное оранжевым цветом. Стоит заметить, что если в первой строчке не совпадают числа, то и в остальных они тоже не совпадут. Верно и обратное. Если в первой строчке совпадут числа, то и для остальных остатков тоже числа будут совпадать.
Найдём, число, для которого будут совпадать эти числа, отмеченные зелёным и оранжевым цветом.
10 + 0 = 10 (остаток при делении 10 на 4 равен 2) Не подходит
9 + 0 = 9 (остаток при делении 9 на 4 равен 1) Не подходит
8 + 0 = 8 (остаток при делении 8 на 4 равен 0) Подходит!
Значит, число 8 нам подходит. Число 8 — это результат работы алгоритма в первом пункте. Нас просят найти максимальное число. Следовательно, возьмём остаток 3, чтобы исходное число N было как можно больше. Тогда N будет:
N = 8 + 3 = 11
Ответ получается 11.
Второй способ. Решим задачу с помощью Python’а.
Перебираем числа от 100 до 1 с помощью цикла for. Третий параметр «-1» в цикле for говорит о том, что мы перебираем числа в обратном порядке.
for i in range(100, 0, -1): n = i n = n - n % 4 # Выполняем первый пункт n = format(n, 'b') # Переводим в двоичную систему n = n + str(n.count('1') % 2) # Подпункт a) третьего пункта n = n + str(n.count('1') % 2) # Подпункт б) третьего пункта r = int(n, 2) # Переводим из двоичной системы в десятичную if r < 47: print(i)
В этой программе запрограммировали алгоритм, который указан в задаче. Если значение переменной r (результат работы алгоритма) меньше 47, то печатаем это значение на экран. Первое распечатанное число и есть ответ к задаче.
В переменную n по очереди подставляются числа из нашего диапазона (100-1). Команда % находит остаток от деления.
Функция count, в данном случае, подсчитывает количество единиц в строке, которая находится в переменной n.
Ответ: 11
Задача (Демо 2023)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если сумма цифр в двоичной записи числа чётная, то к этой записи справа дописывается 0, а затем два левых разряда заменяются на 10;
б) если сумма цифр в двоичной записи числа нечётная, то к этой записи справа дописывается 1, а затем два левых разряда заменяются на 11.
Полученная таким образом запись является двоичной записью искомого числа R.
Например, для исходного числа 610 = 1102 результатом является число 10002 = 810, а для исходного числа 410 = 1002 результатом является число 11012 = 1310.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, большее 40. В ответе запишите это число в десятичной системе счисления.
Решение:
for n in range(1, 1000): s=format(n, 'b') if s.count('1')%2==0: s = s + '0' s = '10' + s[2:] else: s = s + '1' s = '11' + s[2:] r=int(s, 2) if r>40: print(n)
Здесь мы пишем программу, как было написано в уроке видеокурса ЕГЭ по информатике. Но, действительно, встречается и новый приём. Нужно изменить левые символы нашей строки s. Это можно сделать с помощью такой конструкции s[2:]. Таким образом, мы берём всю строку, кроме двух первых символов. Например, s=’football’, то s[2:] будет обозначать ‘otball’.
Повторим основные идеи такого подхода при решении пятого задания из ЕГЭ по информатике с помощью программирования. Перебираем числа от 1 до 999 с помощью цикла for. В этом диапазоне надеемся найти наш ответ. С помощью команды format() превращаем число в строку уже в двоичной системе. Сумма цифр в строке зависит только от количества единиц. Нули ничего не дают в сумму. Поэтому применяем функцию .count. Дальше всё делаем, как написано в условии задачи. Команда int(s, 2) превращает строку в двоичной системе в число опять в десятичной системе счисления.
Ответ: 16
Задача (Решаем с помощью Python)
Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:
1) Строится двоичная запись числа N.
2) В конец записи (справа) дописывается вторая справа цифра двоичной записи.
3) В конец записи (справа) дописывается вторая слева цифра двоичной записи.
4) Результат переводится в десятичную систему.
Пример. Дано число N = 11. Алгоритм работает следующим образом.
1) Двоичная запись числа N: 11 = 10112
2) Вторая справа цифра 1, новая запись 101112.
3) Вторая слева цифра 0, новая запись 1011102.
4) Десятичное значение полученного числа 46.
При каком наименьшем числе N в результате работы алгоритма получится R > 170? В ответе запишите это число в десятичной системе счисления.
Решение:
Напишем программу на Python.
for n in range(2, 1000): s=format(n, 'b') s=s+s[-2] s=s+s[1] r=int(s, 2) if r>170: print(n)
Получается наименьшее число 43. К последнему символу можем обратится s[-1], к предпоследнему s[-2]. Но счёт слева начинается с нуля. Первый символ это s[0], второй символ s[1] и т.д.
Обратите внимание, что перебирать числа n в этой задаче начинаем с 2.
Ответ: 43
Задача(Восьмибитное число)
(А.М. Кабанов) Автомат обрабатывает натуральное число N (1≤N≤255) по следующему алгоритму:
1) Строится восьмибитная двоичная запись числа N.
2) Удаляется последняя цифра двоичной записи.
3) Запись «переворачивается», то есть читается справа налево.
4) Полученное число переводится в десятичную запись и выводится на экран.
Каково наибольшее число, меньшее 100, которое после обработки автоматом не изменится?
Решение:
for n in range(1, 256): s=format(n, 'b') # делаем 8-ое число while(len(s)<8): s='0'+s s=s[:-1] #удаляется последняя цифра s=s[::-1] #число переворачивается r=int(s, 2) if n<100 and r==n: print(n)
Ответ получается 90.
Восьмибитное число имеет длину 8 символов. После того, как перевели число n в двоичный вид, с помощью цикла while добисываем нули слева к строке s, пока длина этой строки меньше 8.
Удалить последнюю цифру можно с помощью конструкции s[:-1]. Здесь мы оставляем все цифры, начиная с первой до последней (не включительно).
Перевернуть строку можно с помощью конструкции s[::-1].
Далее решаем как обычно. Число не изменится, если входное число n равно выходному числу r.
Ответ: 90
Разберём задачу, которая была в пробном варианте от 3.02.23 в одном из регионов.
Задача(Пробник 3.02.23)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если сумма цифр в двоичной записи числа чётная, то к этой записи справа дописывается 0, а затем два левых разряда заменяются на 1;
б) если сумма цифр в двоичной записи числа нечётная, то к этой записи справа дописывается 1, а затем два левых разряда заменяются на 11;
Полученная таким образом запись является двоичной записью искомого числа R.
Например, для исходного числа 610 = 1102 результатом является число 1002 = 410, а для исходного числа 410 = 1002 результатом является число 11012 = 1310.
Укажите число N, после обработки которого с помощью этого алгоритма получается наименьшее значение R, большее 49. В ответе запишите это число в десятичной системе.
Решение:
Напишем программу на языке Python.
for n in range(1, 1000): s=format(n, 'b') if s.count('1')%2==0: s = s + '0' s = '1' + s[2:] else: s = s + '1' s = '11' + s[2:] r=int(s, 2) if r>49: print(r, n)
Хитрость задачки заключается в том, что числа r возрастают неравномерно.
Нам необходимо глазами найти наименьше число r (первое число). Это число 50, а n для него равно 57.
При желании программу можно переписать следующим образом:
r_min=10**9 n_r_min = 0 for n in range(1, 1000): s=format(n, 'b') if s.count('1')%2==0: s = s + '0' s = '1' + s[2:] else: s = s + '1' s = '11' + s[2:] r=int(s, 2) if r > 49: if r < r_min: r_min=r n_r_min=n print(n_r_min)
Здесь ищется минимальное число r автоматически и для него запоминается значение n, которое пойдет в ответ.
Ответ: 57
Боковой вариант 5-ого задания из ЕГЭ по информатике.
Задача (Лучше знать)
Автомат получает на вход четырёхзначное число. По этому числу строится новое число по следующим правилам:
1. Перемножаются первая и вторая, а также третья и четвёртая цифры исходного числа.
2. Полученные два числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 2465. Суммы: 2 * 4 = 8; 6 * 5 = 30. Результат: 308. Укажите наибольшее число, в результате обработки которого автомат выдаст число 124.
Решение:
В подобных задачах из ЕГЭ по информатике нумерация происходит начиная со старшего разряда.
Первое правило можно представить следующим образом:
Второе правило заключается в том, что мы «соединяем» два числа, полученных в первом пункте, причём, сначала идёт большее число, а затем меньшее.
Проанализируем число 124.
Чтобы четырёхзначное число было наибольшим, выгодно, чтобы в старшем разряде стояла 9. Но, не у числа 12, не у числа 4, нет такого делителя. Какой наибольший делитель мы можем получить? Это число 6. Число 6 является делителем 12-ти. Значит, первая цифра будет 6, а вторая цифра будет 2 (6*2=12).
Рассмотрим второе число 4. Третий разряд тоже желательно сделать побольше. Значит, в четвёртый разряд поставим 4, а в младший разряд 1 (4*1=4).
Ответ получается 6241.
Ответ: 6241
Счастливых экзаменов! Видеоролик можете посмотреть ниже!
Второе задание с заменой символом пытался сделать через команду .replace, в консоль выводились почему-то только четные числа, можете обьяснить что не так?
for unk in range(1, 1000):
unk = (bin(unk)[2:])
if «1» in unk:
unk = unk.replace(«1», «10»)
elif «0» in unk:
unk = unk.replace(«0», «01»)
R = int(unk, 2)
# if R < 256 and R % 2 != 0:
print(R)
Я так понимаю, что вы заменяете либо единицы, либо нули. А нужно в одной записи заменить и единицы, и нули. Через реплейс тоже можно решить. s=s.replace(‘1’, ‘2’) s=s.replace(‘0′, ’01’) s=s.replace(‘2′, ’10’). Т.е. мы превращаем 1 в символ, которого точно нет в строке, потом делаем замены.
Урок посвящен тому, как решать 5 задание ЕГЭ по информатике
Содержание:
- Объяснение 5 задания
- Исполнитель для возведения в квадрат, деления, умножения и сложения
- Проверка числовой последовательности на соответствие алгоритму
- Разбор 5 задания
- Решение задания про алгоритм, который строит число R
- Решение заданий для темы Проверка числовой последовательности (Автомат)
5-е задание: «Анализ алгоритмов и исполнители»
Уровень сложности
— базовый,
Требуется использование специализированного программного обеспечения
— нет,
Максимальный балл
— 1,
Примерное время выполнения
— 4 минуты.
Проверяемые элементы содержания: Формальное исполнение алгоритма, записанного на естественном языке, или умение создавать линейный алгоритм для формального исполнителя с ограниченным набором команд
До ЕГЭ 2021 года — это было задание № 6 ЕГЭ
Типичные ошибки и рекомендации по их предотвращению:
«Как и в других заданиях базового уровня сложности, источником ошибок служит недостаточная внимательность и отсутствие или поверхностность самостоятельной проверки полученного ответа»
ФГБНУ «Федеральный институт педагогических измерений»
Проверка числовой последовательности на соответствие алгоритму
- для выполнения некоторых заданий необходимо повторить тему системы счисления;
- максимальное значение суммы цифр десятичного числа — это 18, так как 9 + 9 = 18;
- для проверки правильности переданного сообщения иногда вводится бит четности — дополнительный бит, которым дополняется двоичный код таким образом, чтобы в результате количество единиц стало четным: т.е. если в исходном сообщении количество единиц было четным, то добавляется 0, если нечетным — добавляется 1:
например: 310 = 112 после добавления бита четности: 110 ---- 410 = 1002 после добавления бита четности: 1001
например: 1112 - это 710 добавим 0 справа: 11102 - это 1410
Теперь будем рассматривать конкретные типовые экзаменационные варианты по информатике с объяснением их решения.
Разбор 5 задания
Задание демонстрационного варианта 2022 года ФИПИ
Плейлист видеоразборов задания на YouTube:
Решение задания про алгоритм, который строит число R
5_11:
На вход алгоритма подается натуральное число N. Алгоритм строит по нему новое число R следующим образом:
- Строится двоичная запись числа 4N.
- К этой записи дописываются справа еще два разряда по следующему правилу:
- складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 10000 преобразуется в запись 100001;
- над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2.
Полученная таким образом запись является двоичной записью искомого числа R.
Укажите такое наименьшее число N, для которого результат работы алгоритма больше 129. В ответе это число запишите в десятичной системе счисления.
Типовые задания для тренировки
✍ Решение:
-
✎ Решение аналитическим способом:
- Заметим, что после выполнения второго пункта задания, будут получаться только четные числа! Наименьшим возможным четным числом, превышающим 129, является число 130. С ним и будем работать.
- Переведем 130 в двоичную систему счисления. Используя компьютер это можно сделать с помощью программистского режима калькулятора. Либо в консоли интерпретатора Python набрать
bin(130)
. Получим:
13010 = 100000102
в обратном порядке: было 1000001 -> стало 10000010 еще раз то же самое: было 100000 -> стало 1000001
int('100000',2)
.1000002 = 3210
✎ Решение с использованием программирования:
PascalAbc.Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
uses school; begin var n_ := 1; while True do begin var n := 4*n_; var ost := bin(n).CountOf('1') mod 2; // остаток при делении на 2 n := 2 * n + ost; //в двоичной с.с. добавляем разряд (*2) и остаток к этому разряру (+ost) ost := bin(n).CountOf('1') mod 2; // остаток при делении на 2 n := 2 * n + ost; if n > 129 then begin println(n_); break end; n_ += 1; end; end. |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
n_ = 1 while True: n = 4*n_ r = str(bin(n)) r = r[2:] for i in range(2): if r.count('1') % 2 == 0: r+='0' else: r+='1' n = int(r, base=2) if n > 129: print(n_) break n_+=1 |
Результат: 8
Для более детального разбора предлагаем посмотреть видео теоретического решения данного 5 задания ЕГЭ по информатике:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
5_12: Демоверсия ЕГЭ 2018 информатика:
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
- Строится двоичная запись числа N.
- К этой записи дописываются справа ещё два разряда по следующему правилу:
- складываются все цифры двоичной записи числа N, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;
- над этой записью производятся те же действия – справа дописывается остаток от деления суммы её цифр на 2.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите минимальное число R, которое превышает число 83 и может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе счисления.
✍ Решение:
- Заметим, что после второго пункта условия задачи получаются только четные числа (т.к. если число в двоичной системе заканчивается на 0, то оно четное). Таким образом, нас будут интересовать только четные числа.
- Наименьшим возможным числом, превышающим 83, является число 84. С ним и будем работать.
- Переведем 84 в двоичную систему счисления. На компьютерном ЕГЭ это можно сделать с помощью программистского режима калькулятора. Либо в консоли интерпретатора Python набрать
bin(84)
. Получим:
84 = 1010100
86 = 1010110
Результат: 86
Подробное решение данного 5 (раньше №6) задания из демоверсии ЕГЭ 2018 года смотрите на видео:
Видеорешение с программированием (PascalAnc.Net):
📹 YouTube здесь
📹 Видеорешение на RuTube здесь
Аналитическое видеорешение:
📹 Видеорешение на RuTube здесь -> аналитическое решение
5_18:
Алгоритм получает на вход натуральное число N > 1
и строит по нему новое число R
следующим образом:
1. Строится двоичная запись числа N
.
2. Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется цифра, которая встречается реже.
3. Шаг 2 повторяется ещё два раза.
4. Результат переводится в десятичную систему счисления.
При каком наименьшем исходном числе N > 65
в результате работы алгоритма получится число, кратное 4?
Типовые задания для тренировки
✍ Решение:
-
✎ Решение с использованием программирования:
PascalAbc.Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
uses school; begin var n_ := 1; while True do begin var n := n_; for var i := 1 to 3 do begin if bin(n).CountOf('1') = bin(n).CountOf('0') then // сравниваем if n mod 2 = 0 then // если четное, то в конце 0 n := 2 * n // добавляем разряд = 0 else n := 2 * n + 1 // иначе добавляем разряд = 1 else if bin(n).CountOf('1') > bin(n).CountOf('0') then n := 2 * n else n := 2 * n + 1 end; if (n_ > 65) and (n mod 4 = 0) then begin println(n_); break end; n_ += 1; end; end. |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
n_ = 1 while True: n = n_ r = str(bin(n)) r = r[2:] for i in range(3): if r.count('1') == r.count('0'): r+=r[-1] elif r.count('1')>r.count('0'): r+='0' else: r+='1' n = int(r, base=2) if n_ > 65 and n % 4 == 0 : print(n_,n) break n_+=1 |
Ответ: 79
5_19:
На вход алгоритма подаётся натуральное число N
. Алгоритм строит по нему новое число R
следующим образом.
1) Число N
переводим в двоичную запись.
2) Инвертируем все биты числа кроме первого.
3) Переводим в десятичную запись.
4) Складываем результат с исходным числом N
.
Полученное число является искомым числом R
.
Укажите наименьшее нечетное число N
, для которого результат работы данного алгоритма больше 99. В ответе это число запишите в десятичной системе счисления.
✍ Решение:
-
✎ Решение с использованием программирования:
PascalAbc.Net:
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
n_ = 1 while True: n = n_ r = str(bin(n)) r = r[2:] for i in range(1,len(r)): if r[i]== '0': r=r[:i]+'1'+r[i+1:] else: r=r[:i]+'0'+r[i+1:] n = int(r, base=2) n+=n_ if n > 99 and n_ % 2 != 0 : print(n_,n) break n_+=1 |
Ответ: 65
5_13:
На вход алгоритма подается натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. К этой записи дописываются справа еще два разряда по следующему правилу:
— если N делится нацело на 4, в конец числа (справа) дописывается сначала ноль, а затем еще один ноль;
— если N при делении на 4 дает в остатке 1, то в конец числа (справа) дописывается сначала ноль, а затем единица;
— если N при делении на 4 дает в остатке 2, то в конец числа (справа) дописывается сначала один, а затем ноль;
— если N при делении на 4 дает в остатке 3, в конец числа (справа) дописывается сначала один, а затем еще одна единица.
Например, двоичная запись 1001 числа 9 будет преобразована в 100101, а двоичная запись 1100 числа 12 будет преобразована в 110000.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа R — результата работы данного алгоритма.
Укажите максимальное число R, которое меньше 100 и может являться результатом работы данного алгоритма. В ответе это число запишите
в десятичной системе счисления
.
Типовые задания для тренировки
✍ Решение:
- Поскольку требуется найти наибольшее число, то возьмем наибольшее из возможных чисел, которые < 100 — это число 99. Переведем его в двоичную систему. На компьютерном ЕГЭ это можно сделать с помощью программистского режима калькулятора. Либо в консоли интерпретатора Python набрать
bin(99)
. Получим:
99 = 11000112
1100011 N
int('11000',2)
11000 = 2410
98 = 11000102 : 10 в конце добавлено алгоритмом N = 110002 = 2410 24 делится нацело на 4. По алгоритму в конце должно быть 00, а мы имеем 10 98 - не подходит 97 = 11000012 : 01 в конце добавлено алгоритмом N = 110002 = 2410 24 делится нацело на 4. По алгоритму в конце должно быть 00, а мы имеем 01 97 - не подходит 96 = 11000002 : 00 в конце добавлено алгоритмом N = 110002 = 2410 24 делится нацело на 4. По алгоритму в конце должно быть 00, у нас 00 - верно! 96 - подходит!
Результат: 96
Предлагаем посмотреть видео теоретического решения:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
5_14:
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. К этой записи дописывается (дублируется) последняя цифра.
3. Затем справа дописывается бит чётности: 0, если в двоичном коде полученного числа чётное число единиц, и 1, если нечётное.
4. К полученному результату дописывается ещё один бит чётности.
Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.
Укажите минимальное число R, большее 114, которое может быть получено в результате работы этого алгоритма. В ответе это число запишите в десятичной системе.
Типовые задания для тренировки
✍ Решение:
-
✎ Решение аналитическим способом:
- В постановке задания задано R > 114. R — это результат работы алгоритма. Для того, чтобы определить наименьшее возможно N, переведем сначала 114 в двоичную систему счисления и выделим в нем три добавленные по алгоритму цифры (перевод можно выполнить в консоли Питона:
bin(114)
)
114 = 11100102
2. В полученное числе N = 1110 дублируется последняя цифра и получается 11100.
3. Поскольку число единиц (3) — нечетное, то справа добавляется 1: 111001.
4. Т.к. в полученном наборе цифр четное число единиц, то добавляем 0: 1110010
1. N = 1110 + 1 = 1111 Работа по алгоритму: 2. 11111 - дублирование последней цифры. 3. 111111 - справа дописываем единицу, т.к. в полученном числе 5 единиц (нечетное) 4. 1111110 - дописываем ноль, т.к. в полученном числе четное число единиц.
int('1111110',2)
):min R = 11111102 = 12610
✎ Решение с использованием программирования:
PascalAbc.Net:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
uses school; begin var n_ := 1; while True do begin var n := n_; // дублирвание последней цифры if n mod 2 = 0 then // если четное, то в конце 0 n := 2 * n // добавляем разряд = 0 else n := 2 * n + 1; // иначе добавляем разряд = 1 for var i := 1 to 2 do begin if bin(n).CountOf('1') mod 2 = 0 then n := 2 * n // добавляем разряд = 0 else n := 2 * n + 1 // иначе добавляем разряд = 1 end; if n > 114 then begin println(n); break end; n_ += 1; end; end. |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
n_ = 1 while True: n = n_ r = str(bin(n)) # строковое значение r = r[2:] # убираем 0b r=r+r[-1] for i in range (2): if r.count('1') % 2 == 0: r = r+'0' else: r = r+'1' r = int(r,base = 2) # в 10-ю с.с. if r > 114: print(r) break n_+= 1 |
Результат: 126
5_17: Досрочный вариант 1 ЕГЭ по информатике 2020, ФИПИ:
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются справа ещё два разряда по следующему правилу:
— если N чётное, в конец числа (справа) дописываются два нуля, в противном случае справа дописываются две единицы.
Например, двоичная запись 1001 числа 9 будет преобразована в 100111.
Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа – результата работы данного алгоритма.
Укажите минимальное число N, для которого результат работы алгоритма будет больше 134. В ответе это число запишите в десятичной системе счисления.
Ответ: 33
Видео -> теоретическое решение
📹 Видеорешение на RuTube здесь -> теоретическое решение
5_16:
Автомат обрабатывает целое число N (0 ≤ N ≤ 255) по следующему алгоритму:
1. Строится восьмибитная двоичная запись числа N.
2. Все цифры двоичной записи заменяются на противоположные (0 на 1, 1 на 0).
3. Полученное число переводится в десятичную запись.
4. Из нового числа вычитается исходное, полученная разность выводится на экран.
Какое число нужно ввести в автомат, чтобы в результате получилось 45?
✍ Решение:
- Результатом выполнения алгоритма является число 45. Алгоритм работает в двоичной системе счисления, поэтому переведем число:
45 = 001011012
1 - 0
, с учетом, что у разряда с единицей заняли. То есть бит:. _ 1 _ _ _ _ _ _ _ N инвертируемое = 0 _ _ _ _ _ _ _ N исходное 0 0 1 0 1 1 0 1 = 45 результат
1 - 0
не может в результате дать 0, так как у следующей слева единицы мы заняли. Значит, 0 - 1
. Чтобы не получить единицу в ответе, необходимо у нуля тоже занять:. . _ 1 0 _ _ _ _ _ _ = 0 1 _ _ _ _ _ _ 0 0 1 0 1 1 0 1 = 45 результат
1 - 0
не может быть, так как у следующего слева нуля мы заняли.Значит
0 - 1
. То есть как раз чтобы получить единицу (10 - 1 = 1
), занимаем у следующих слева разрядов:. . _ 1 0 0 _ _ _ _ _ = 0 1 1 _ _ _ _ _ 0 0 1 0 1 1 0 1 = 45 результат
0 - 1
не может быть. Значит, чтобы получить в результате ноль, берем 1 - 0
, у единицы должно быть занято.. . . _ 1 0 0 1 _ _ _ _ = 0 1 1 0 _ _ _ _ 0 0 1 0 1 1 0 1 = 45 результат
1 - 0
не может быть. Так как слева у единицы занято. Значит, чтобы получить в результате 1, берем 0 - 1
:. . . _ 1 0 0 1 0 _ _ _ = 0 1 1 0 1 _ _ _ 0 0 1 0 1 1 0 1 = 45 результат
0 - 1
не даст в ответе единицу, значит, имеем 1 - 0
:. . . _ 1 0 0 1 0 1 _ _ = 0 1 1 0 1 0 _ _ 0 0 1 0 1 1 0 1 = 45 результат
0 - 1
не может быть, значит, 1 - 0
. Чтобы получить в результате 0, необходимо, чтобы у 1 было занято:. . . . _ 1 0 0 1 0 1 1 _ = 0 1 1 0 1 0 0 _ 0 0 1 0 1 1 0 1 = 45 результат
0 - 1
:. . . . _ 1 0 0 1 0 1 1 0 = 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 = 45 результат
01101001 = 10510
Ответ: 105
Смотрите теоретический разбор задания на видео и подписывайтесь на наш канал:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь -> теоретическое решение
Решение заданий для темы Проверка числовой последовательности (Автомат)
5_7:
Автомат получает на вход четырёхзначное число. По этому числу строится новое число по следующим правилам.
- Складываются первая и вторая, а также третья и четвёртая цифры исходного числа.
- Полученные два числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 3165. Суммы: 3 + 1 = 4; 6 + 5 = 11. Результат: 114.
Укажите наименьшее число, в результате обработки которого, автомат выдаст число 1311.
✍ Решение:
Результат: 2949
Процесс теоретического решения данного 5 задания представлен в видеоуроке:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь -> теоретическое решение
5_8:
Автомат получает на вход четырехзначное число. По нему строится новое число по следующим правилам:
- Складываются первая и вторая, затем вторая и третья, а далее третья и четвёртая цифры исходного числа.
- Полученные три числа записываются друг за другом в порядке возрастания (без разделителей).
Пример: Исходное число: 7531. Суммы: 7+5=12; 5+3=8; 3+1=4. Результат: 4812.
✍ Решение:
2
, 5
, 12
9
:12=9+3
93**
9320
.Результат: 9320
Подробное теоретическое решение данного 5 задания можно просмотреть на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь -> теоретическое решение
5_9:
Автомат получает на вход два двузначных шестнадцатеричных числа. В этих числах все цифры не превосходят цифру 6 (если в числе есть цифра больше 6, автомат отказывается работать). По этим числам строится новое шестнадцатеричное число по следующим правилам:
- Вычисляются два шестнадцатеричных числа — сумма старших разрядов полученных чисел и сумма младших разрядов этих чисел.
- Полученные два шестнадцатеричных числа записываются друг за другом в порядке убывания (без разделителей).
Пример: Исходные числа: 25, 66. Поразрядные суммы: 8, B. Результат: B8.
Какие из предложенных чисел могут быть результатом работы автомата?
Перечислите в алфавитном порядке буквы, соответствующие этим числам, без пробелов и знаков препинания.
Варианты:
A) 127
B) C6
C) BA
D) E3
E) D1
✍ Решение:
Проанализируем все варианты:
12
в шестнадцатеричной системе записывается как С
.С6
разбиваем на 12
и 6
. Число может быть результатом работы автомата. Исходные числа, например, 35
и 37
BA
разбиваем на 11
и 10
. Число может быть результатом работы автомата. Исходные числа, например, 55
и 56
E3
разбиваем на 14
и 3
. 14=6+8
, но цифры большие 6 не принимает автомат. Не подходит.D1
разбиваем на 13
и 1
. 13=6+7
, но цифры большие 6 не принимает автомат. Не подходит.Результат: BC
Подробное теоретическое решение данного 5 задания можно просмотреть на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь -> теоретическое решение
5_10: Задание 5 ГВЭ 11 класс 2018 год ФИПИ
Автомат получает на вход два двузначных шестнадцатеричных числа. В этих числах все цифры не превосходят цифру 7 (если в числе есть цифра больше 7, автомат отказывается работать). По этим числам строится новое шестнадцатеричное число по следующим правилам.
1. Вычисляются два шестнадцатеричных числа: сумма старших разрядов полученных чисел и сумма младших разрядов этих чисел.
2. Полученные два шестнадцатеричных числа записываются друг за другом в порядке возрастания (без разделителей).
Пример. Исходные числа: 66, 43. Поразрядные суммы: A, 9. Результат: 9A.
Определите, какое из предложенных чисел может быть результатом работы автомата.
Варианты:
1) AD
2) 64
3) CF
4) 811
✍ Решение:
Теоретическое решение 4 задания ГВЭ 11 класса смотрите на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь -> теоретическое решение
5_15:
Автомат получает на вход натуральное число X. По этому числу строится трёхзначное число Y по следующим правилам:
1. Первая цифра числа Y (разряд сотен) – остаток от деления X на 7.
2. Вторая цифра числа Y (разряд десятков) – остаток от деления X на 2.
3. Третья цифра числа Y (разряд единиц) – остаток от деления X на 5.
Пример. Исходное число: 55. Остаток от деления на 7 равен 6; остаток от деления на 2 равен 1; остаток от деления на 5 равен 0. Результат работы автомата: 610.
Сколько существует двузначных чисел, при обработке которого автомат выдаёт результат 312?
Типовые задания для тренировки
✍ Решение:
- Обозначим каждую цифру числа Y согласно заданию:
Y = 3 1 2 x mod 7 x mod 2 x mod 5
1. x mod 2 = 1 => значит, X — нечетное число
2. x mod 5 = 2 => значит, X — либо ?2, либо ?7.
3. раз x — нечетное, то из пред. пункта получаем x = ?7
4. x mod 7 = 3 => переберем все варианты:
97 - не подходит, 87 - подходит (87 / 7 = 12, остаток = 3) 77 - не подходит, 67 - не подходит, 57 - не подходит, 47 - не подходит, 37 - не подходит, 27 - не подходит, 17 - подходит (17 / 7 = 2, остаток = 3)
Результат: 2
Visko 0 / 0 / 0 Регистрация: 08.04.2022 Сообщений: 4 |
||||||||
1 |
||||||||
21.01.2023, 19:09. Показов 2066. Ответов 5 Метки python 3.8, егэ (Все метки)
Текст задачи: На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. Мой код:
Код составителей ЕГЭ:
Мой код выдаёт ответ — 2, код составителей ЕГЭ — 3. Найдите пожалуйста мою ошибку и объясните пожалуйста помеченную строчку в коде составителей экзамена
__________________
0 |
Semen-Semenich 4122 / 3047 / 1091 Регистрация: 21.03.2016 Сообщений: 7,680 |
||||||||
21.01.2023, 19:26 |
2 |
|||||||
for n in range(1000): Добавлено через 6 минут
может есть четное число в двоичной записи которого нечетное количество 1 или наоборот
1 |
OT4EHb 4 / 2 / 2 Регистрация: 21.01.2023 Сообщений: 5 |
||||||||
21.01.2023, 19:32 |
3 |
|||||||
Сообщение было отмечено Visko как решение Решение
Это проверка чётности количества единиц
А это проверка чётности самого числа
1 |
4122 / 3047 / 1091 Регистрация: 21.03.2016 Сообщений: 7,680 |
|
21.01.2023, 19:35 |
4 |
OT4EHb, так по условию
если число чётное при чем тут четность единиц в двоичной записи? Добавлено через 1 минуту
0 |
4 / 2 / 2 Регистрация: 21.01.2023 Сообщений: 5 |
|
21.01.2023, 19:40 |
5 |
Нет, на чётность/нечётность влияет только одна единица, которая в конце Добавлено через 1 минуту
1 |
4122 / 3047 / 1091 Регистрация: 21.03.2016 Сообщений: 7,680 |
|
21.01.2023, 19:43 |
6 |
del Добавлено через 2 минуты Не по теме: OT4EHb, прокрутил страницу и уже не вижу что автор топика Visko, и отвечаю тебе как автору и не пойму в чем проблема вроде все знаешь а такая ошибка
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
21.01.2023, 19:43 |
Помогаю со студенческими работами здесь C4 В ЕГЭ по информатике ЕГЭ по информатике Добавлено через 58 секунд C4 ЕГЭ по информатике ЕГЭ по информатике ЕГЭ по информатике На каком языке… ЕГЭ по информатике Задачи ЕГЭ по информатике … Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!
В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка Python.
Вот я и подумал, чтобы не получилось как в песне, стоит этим заняться. Я расскажу про все задачи первой части и их решения на примере демо варианта ЕГЭ за октябрь.
Всех желающих — приглашаю ниже!
Быстрый перевод из системы в систему
В Python есть интересные функции bin()
, oct()
и hex()
. Работают данные функции очень просто:
bin(156) #Выводит '0b10011100'
oct(156) #Выводит '0o234'
hex(156) #Выводит '0x9c'
Как вы видите, выводится строка, где 0b — означает, что число далее в двоичной системе счисления, 0o — в восьмеричной, а 0x — в шестнадцатеричной. Но это стандартные системы, а есть и необычные…
Давайте посмотрим и на них:
n = int(input()) #Вводим целое число
b = '' #Формируем пустую строку
while n > 0: #Пока число не ноль
b = str(n % 2) + b #Остатот от деления нужной системы (в нашем сл записываем слева
n = n // 2 #Целочисленное деление
print(b) #Вывод
Данная программа будет работать при переводе из десятичной системы счисления в любую до 9, так как у нас нет букв. Давайте добавим буквы:
n = int(input()) #Вводим целое число
b = '' #Формируем пустую строку
while n > 0: #Пока число не ноль
if (n % 21) > 9: #Если остаток от деления больше 9...
if n % 21 == 10: #... и равен 10...
b = 'A' + b #... запишем слева A
elif n % 21 == 11:#... и равен 11...
b = 'B' + b#... запишем слева B
'''
И так далее, пока не дойдём до системы счисления -1 (я переводил в 21-ную систему и шёл до 20)
'''
elif n % 21 == 11:
b = 'B' + b
elif n % 21 == 12:
b = 'C' + b
elif n % 21 == 13:
b = 'D' + b
elif n % 21 == 14:
b = 'E' + b
elif n % 21 == 15:
b = 'F' + b
elif n % 21 == 16:
b = 'G' + b
elif n % 21 == 17:
b = 'H' + b
elif n % 21 == 18:
b = 'I' + b
elif n % 21 == 19:
b = 'J' + b
elif n % 21 == 20:
b = 'K' + b
else: #Иначе (остаток меньше 10)
b = str(n % 21) + b #Остатот от деления записываем слева
n = n // 21 #Целочисленное деление
print(b) #Вывод
Способ объёмен, но понятен. Теперь давайте используем тот же функцию перевода из любой системы счисления в любую:
def convert_base(num, to_base=10, from_base=10):
# Перевод в десятичную систему
if isinstance(num, str): # Если число - строка, то ...
n = int(num, from_base) # ... переводим его в нужную систему счисления
else: # Если же ввели число, то ...
n = int(num) # ... просто воспринять его как число
# Перевод десятичной в 'to_base' систему
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Берём алфавит
if n < to_base: # Если число меньше системы счисления в которую переводить...
return alphabet[n] # ... вернуть значения номера в алфавите (остаток от деления)
else: # Иначе...
return convert_base(n // to_base, to_base) + alphabet[n % to_base] # ... рекурсивно обратиться к функии нахождения остатка
Вызвав функцию вывода print(convert_base(156, 16, 10))
мы переведём 156 из 10 в 16 систему счисления, а введя print(convert_base('23', 21, 4))
переведёт 23 из 4-ичной в 21-ичную систему (ответ: B).
Задача 2
Все задания беру из первого октябрьского варианта (он же вариант № 9325894) с сайта Решу.ЕГЭ.
Решение данной задачи совсем простое: банальный перебор.
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
for x in range(2):
for z in range(2):
for w in range(2):
F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
print(x, y, z, F) #Выводим результат
Результат:
Нам вывелась вся таблица истинности (1 = True, 0 = False). Но это не очень удобно. Обратите внимание, что в задании, функция равно 0, так и давайте подправим код:
print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
for x in range(2):
for z in range(2):
for w in range(2):
F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
if not F:
print(x, y, z, F) #Выводим результат
Результат:
Далее — простой анализ.
Задача 5
Данная задача легко решается простой последовательностью действий в интерпретационном режиме:
Задача 6
Перепечатали и получили ответ:
s = 0
k = 1
while s < 66:
k += 3
s += k
print(k)
Задача 12
В очередной раз, просто заменим слова на код:
a = '9' * 1000
while '999' in a or '888' in a:
if '888' in a:
a = a.replace('888', '9', 1)
else:
a = a.replace('999', '8', 1)
print(a)
Задача 14
Компьютер железный, он всё посчитает:
a = 4 ** 2020 + 2 ** 2017 - 15
k = 0
while a > 0:
if a % 2 == 1:
k += 1
a = a // 2
print(k)
Задача 16
Опять же, просто дублируем программу в python:
def F(n):
if n > 0:
F(n // 4)
print(n)
F (n - 1)
print(F(5))
Результат:
Задача 17
Задача с файлом. Самое сложное — достать данные из файла. Но где наша не пропадала?!
with open("17.txt", "r") as f: #Открыли файл 17.txt для чтения
text = f.read() #В переменную text запихнули строку целиком
a = text.split("n") #Разбили строку энтерами (n - знак перехода на новую строку)
k = 0 #Стандартно обнуляем количество
m = -20001 #Так как у нас сумма 2-ух чисел и минимальное равно -10000, то минимум по условию равен -20000, поэтому...
for i in range(len(a)): #Обходим все элементы массива
if (int(a[i - 1]) % 3 == 0) or (int(a[i]) % 3 == 0): #Условное условие
k += 1 #Счётчик
if int(a[i - 1]) + int(a[i]) > m: #Нахождение минимума
m = int(a[i - 1]) + int(a[i])
print(k, m) #Вывод
Немного пояснений. Функция with() открывает файл считывает данные при помощи функции read() и закрывает файл. В остальном — задача стандартна.
Задача 19, 20 и 21
Все три задачи — задачи на рекурсию. Задачи идентичны, а вопросы разные. Итак, первая задача:
Пишем рекурсивную функцию и цикл перебора S:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 3: #Условия завершения игры
return p == 3
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
break
Немного пояснений. В рекурсивной функции существует 3 переменные x
— число камней в первой куче, y
— число камней во второй куче, p
— позиция. Позиция рассчитывается по таблице:
Игра |
Петя |
Ваня |
Петя |
Ваня |
Петя |
|
p |
1 |
2 |
3 |
4 |
5 |
6 |
Далее — всё по условию задачи.
Вторая задача на теорию игр:
Все отличия в рамке. Ну и код, соответственно, не сильно отличается:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 4: #Условия завершения игры
return p == 4
if p % 2 != 0:
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
else:
return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
Отличия:
-
Выиграл Петя, соответственно, позиция 4
-
Так как Петя не может выиграть за один ход — он выигрывает за 2 хода (and, а не or на нечётных позициях (играх Пети))
-
Убрали break, так как нам нужны все S, а не единственный
Последняя вариация задачи:
Сразу код:
def f(x, y, p): #Рекурсивная функция
if x + y >= 69 or p > 5: #Условия завершения игры
return p == 3 or p == 5
if p % 2 == 0:
return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
else:
return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
for s in range (1, 58 + 1): #Перебор S
if f(10, s, 1): #Начали с 10 камней
print(s)
Ну и всего лишь 2 отличия:
-
Позиции 3 или 5, а не 4, так как выиграл Ваня
-
На второй ход выигрывает Ваня и нам нужно or и and поменять. Я заменил только кратность 2.
Задача 22
Ctrl+C, Ctrl+V — наше всё!
for i in range(1, 100000):
x = i
L = 0
M = 0
while x > 0 :
L = L+1
if (x % 2) != 0:
M = M + x % 8
x = x // 8
if L == 3 and M == 6:
print(i)
Задача 23
Итак, код:
def f(x, y):
if x > y: #Перегнали цель
return 0
if x == y: #Догнали цель
return 1
if x < y: #Догоняем цель тремя методами
return f(x + 1, y) + f(x + 2, y) + f(x * 2, y)
print(f(3, 10) * f(10, 12)) #Прошло через 10, значит догнали 10 и от де догоняем 12
Так как в условии задачи мы увеличиваем число, но будем числа «догонять». Три метода описаны, ну а пройти через 10 — значит дойти до него и идти от него.
Собственно, это и есть вся первая часть ЕГЭ по информатике решённая на Python.
Ссылка на репозиторий со всеми программами:
Надеюсь, что смог помочь в своей статье выпускникам и готовящимся
Остался один вопрос — нужен ли разбор второй части ЕГЭ по информатике на Python? Оставлю этот вопрос на ваше голосование.
Всем удачи!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Делаю разбор второй части?
Проголосовали 105 пользователей.
Воздержались 15 пользователей.
Задача 5 ЕГЭ по информатике средствами языка программирования Python
Вебинар прошёл: 08.02.2023
Просмотров:
81
Поделиться:
Многие аналитические задачи в ЕГЭ по информатике решаются намного быстрее с использованием языка программирования Python, т.к. он имеет для этого весь необходимый функционал.
Рассмотрим такие примеры на вебинаре.
Альбрант Евгений Олегович
учитель высшей категории
Информатика, Подготовка к экзаменам и олимпиадам, ЕГЭ, Программирование
#ЕГЭ
#бесплатно
#Python
#аналитические задачи
#языки программирования
Обсуждение
Войти
Пользователь удалил комментарий
Пройти тестирование по этим заданиям
Вернуться к каталогу заданий
Версия для печати и копирования в MS Word
1
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150. Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка
исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 68 идущих подряд цифр 8? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (222) ИЛИ нашлось (888)
ЕСЛИ нашлось (222)
ТО заменить (222,
ИНАЧЕ заменить (888, 2)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
Источник: Демонстрационная версия ЕГЭ—2016 по информатике.
2
Исполнитель Редактор получает на вход строку цифр и преобразует её.
Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 127 идущих подряд цифр «9»? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (333) ИЛИ нашлось (999)
ЕСЛИ нашлось (333)
ТО заменить (333, 9)
ИНАЧЕ заменить (999, 3)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
3
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из цифры 1, за которой следуют 80 идущих подряд цифр 8? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (18) ИЛИ нашлось (288) ИЛИ нашлось (3888)
ЕСЛИ нашлось (18)
ТО заменить (18, 2)
ИНАЧЕ ЕСЛИ нашлось (288)
ТО заменить (288, 3)
ИНАЧЕ заменить (3888, 1)
КОНЕЦ ЕСЛИ
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
4
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 125 идущих подряд цифр 8? В ответе запишите полученную строку.
НАЧАЛО
ПОКА нашлось (333) ИЛИ нашлось (888)
ЕСЛИ нашлось (333)
ТО заменить (333,
ИНАЧЕ заменить (888, 3)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
5
Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Например, выполнение команды
заменить (111, 27)
преобразует строку 05111150 в строку 0527150.
Если в строке нет вхождений цепочки v, то выполнение команды заменить (v, w) не меняет эту строку.
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
В конструкции
ЕСЛИ условие
ТО команда1
ИНАЧЕ команда2
КОНЕЦ ЕСЛИ
выполняется команда1 (если условие истинно) или команда2 (если условие ложно).
Ниже приведена программа для исполнителя Редактор.
НАЧАЛО
ПОКА нашлось (722) ИЛИ нашлось (557)
ЕСЛИ нашлось (722)
ТО заменить (722, 57)
ИНАЧЕ заменить (557, 72)
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
На вход этой программе подается строка, состоящая из 55 цифр; последняя цифра в строке — цифра 7, а остальные цифры — пятёрки. Какая строка получится в результате применения программы к этой строке? В ответе запишите полученную строку.
Пройти тестирование по этим заданиям
05 задание ЕГЭ информатика (Питон)
for a in range (1,43):
k=a
if k%2==0:
k=k/2
else:
k=k-1
if k%3==0:
k=k/3
else:
k=k-1
if k%7==0:
k=k/7
else:
k=k-1
if k==1:
print(a)
for x in range(2,1000): n=bin(x)[2:] k1=0 k0=0 for i in range(1,len(n),2): k1+=int(n[i]) for i in range (0,len(n),2): if n[i]='0': k0+=1 if abs(k1-k0)==5: print(x)
Алгоритм получает на вход натуральное число ?>1 и строит по нему новое число ? следующим образом:
- Строится двоичная запись числа ?.
- Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется та цифра, которая встречается реже.
- Шаг 2 повторяется ещё два раза.
- Результат переводится в десятичную систему счисления.
Пример. Дано число ?=19. Алгоритм работает следующим образом:
- Двоичная запись числа N: 10011.
- В полученной записи нулей меньше, чем единиц, в конец записи добавляется 0. Новая запись: 100110.
- В текущей записи нулей и единиц поровну, в конец записывается последняя цифра, это 0. Получается 1001100. В этой записи единиц меньше, в конец добавляется 1: 10011001.
- Результат работы алгоритма ?=153.
При каком наименьшем исходном числе ?>99 в результате работы алгоритма получится число, кратное 4?
def modify(st):
(k0, k1) = (st.count('0'), st.count('1'))
if k0 == k1:
st = st + st[-1]
elif k0 > k1:
st = st + '1'
else:
st = st + '0'
return st
N = 99
while True:
strN = bin(N)[2:]
for _ in range(3):
strN = modify(strN)
R = int(strN, 2)
if N > 99 and R % 4 == 0:
print(N);
break
N += 1