вентилятор
Хороших каникул!

ЕГЭ по информатике 2025 - Задание 17 (Пишем программу)



Привет! Сегодня поговорим о 17 задании ЕГЭ по информатике 2025.


В 17 задании нужно считать числа из файла, проанализировать их и ответить на вопрос задачи.


Будем решать задание на языке Python.





Задача (Разминка)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа делятся нацело на 7, затем минимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например для последовательности из пяти элементов: 7; 14; 21; -7; 4 - ответ 3 14.


Скачать файл


Решение:

Напишем программу на языке Python.


f=open('17_1.txt')

k=0
mn=10**10

n1=int(f.readline())

for s in f.readlines():
    n2=int(s)

    if abs(n1)%7==0 and abs(n2)%7==0:
        k=k+1
        mn=min(mn, n1+n2)
    
    n1=n2

print(k, mn)

В начале подвязываемся к файлу с помощью команды open(). Файл и программа должны находится в одной папке, чтобы не прописывать полный путь.


Переменная k отвечает за количество пар, удовлетворяющих условию задачи. Переменная mn - это минимальная сумма элементов подходящих пар.


В переменную mn кладём очень большое число 1010, т.к. будем использовать приём "Царь горы". Такое большое число можно будет легко "победить" при поиске минимального значения.





Затем считываем в переменную n1 первое число из файла. C помощью конструкции "for s in f.readlines():" можно перебрать остальные строки из файла. В цикле считываем второе число для пары в переменную n2. Важно применить функцию int(), чтобы преобразовать строку в число.


После того, как у нас появилась первая пара (n1 и n2), проверяем её под условие задачи. Если одновременно два числа из пары делятся на 7, то подсчитываем такую пару.


Т.к. имеем дело с отрицательными числами и применяем операцию "остаток от деления %", лучше всего, применить функцию модуль числа abs(). Пример: -13%10=7, а должно быть 3. Но если используем функцию модуля, то всё встаёт на свои места abs(-13)%10=3.


Если пара подходит, то проверяем сумму элементов этой пары на минимальность. В переменную mn заносится минимальное значение из двух вариантов: старый лидер mn и новый претендент n1+n2. Это и есть приём "Царь горы".


В конце цикла нужно переложить второе число в переменную n1, чтобы очередное число из файла считалось в переменную n2. Тем самым мы получим новую пару чисел.


Ответ:
97-15820




Задача (Приём мини-счётчик)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество троек элементов последовательности, в которых хотя бы одно из чисел является четырёхзначным, а сумма элементов тройки больше максимального элемента последовательности, оканчивающегося на 80. В ответе запишите количество найденных троек чисел, затем минимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.


Скачать файл


Решение:

Данная задача решается в 2 действия. Первым действием нужно найти максимальное число всей последовательности, которое оканчивается на 80. Напишем программу:


f=open('17_2.txt')

mx=-10**10

for s in f.readlines():
    x = int(s)
    if abs(x)%100==80:
        mx = max(mx, x)

print(mx)

Вновь используем приём "Царь горы". Ищем максимальное число, следовательно, в начале кладём в переменную mx очень маленькое число (принцип наоборот). Перебираем все числа из файла в цикле for.


Проверить, на что оканчивается число, можно с помощью конструкции a%10, a%100, a%1000 и т.д. Сколько нулей, столько последних цифр мы получаем.

Здесь опять имеем дело с отрицательными числами, поэтому используем функцию модуля abs().


Допускаем до "Царя горы" только те числа, которые подходят под условие.


Максимальное число получается 14780.





Во втором действии уже работаем с тройками.


f=open('17_2.txt')

k=0
mn=10**10

n1 = int(f.readline())
n2 = int(f.readline())

for s in f.readlines():

    n3=int(s)
    
    #Приём мини-счётчик
    c=0
    if 1000 <= abs(n1) <= 9999:
        c += 1 
    if 1000 <= abs(n2) <= 9999:
        c += 1
    if 1000 <= abs(n3) <= 9999:
        c += 1

    #Основное условие
    if c >= 1 and n1+n2+n3 > 14780:
        k += 1
        mn = min(mn, n1+n2+n3)

    n1=n2
    n2=n3
    
print(k, mn)

Заводим нужные переменные k и mn, которые будут отвечать за ответ. Зачитываем первые два числа n1 и n2 из тройки до основного цикла.


Третье число из тройки n3 получаем внутри основного цикла. Когда в задаче есть фразы: "хотя бы два элемента", "ровно три элемента", "не более одного элемента" и т.д., удобно применить приём мини-счётчик.


Заводим мини-счётчик c, который будет отвечать за количество четырёхзначных элементов в тройке. Проверяем каждый элемент отдельным условием. Т.к. в файле есть отрицательные числа, удобно опять воспользоваться функцией модуля abs().


Потом идёт основное условие задачи. Если тройка подходит, подсчитываем её и применяем приём "Царь горы", чтобы найти минимальную сумму элементов подходящих троек.


Нужно не забыть переложить элементы n1=n2 и n2=n3, чтобы проанализировать все идущие подряд тройки в файле.


Ответ:
100214898




Задача (ЕГЭ по информатике, 2024, остаток от деления)

В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно. Определите количество пар последовательности, в которых остаток от деления на 55 хотя бы одного из элементов равен минимальному элементу последовательности. В ответе запишите количество найденных пар, затем минимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.


Скачать файл
Решение:

Первым действием найдём минимальный элемент всей последовательности.


f=open('17_2024_2.txt')

mn=10**10

for s in f.readlines():
    x=int(s)
    mn = min(mn, x)
print(mn)

Получается 42.


f=open('17_2024_2.txt')

k=0
mn=10**10

n1=int(f.readline())

for s in f.readlines():
    n2=int(s)
    
    #используем приём мини-счётчик
    c=0
    if n1%55==42: c+=1
    if n2%55==42: c+=1

    #основное условие
    if c>=1:
        k += 1
        mn = min(mn, n1+n2)
    
    n1=n2

print(k, mn)

Здесь вместо приёма мини-счётчика можно было воспользоваться союзом ИЛИ. Но приём мини-счётчик очень мощный и позволяет решать более запутанные формулировки очень эффективно.



2012942




Задача (Среднее значение)

В файле 17_2.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество пар последовательности, в которых оба числа оканчиваются на одну и ту же нечётную цифру, и при этом хотя бы один элемент пары больше среднего арифметического элементов последовательности. В ответе запишите количество найденных пар, а затем максимальный из модулей разности элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.


Скачать файл

Решение:

Задача решается в два действия. В начале нужно найти то, что касается всей последовательности, т.е. среднее значение чисел последовательности.


f=open('17_2.txt')
k=0
sm=0
for s in f.readlines():
    x=int(s)
    k += 1
    sm += x
print(sm/k)

Среднее значение — это сумма элементов, делённая на их количество. Здесь нужно найти среднее значение без каких-либо условий.


Среднее значение получается 29980.700294117647.





Перейдём ко второму действию.


f=open('17_2.txt')

k=0
mx=-10**10

n1 = int(f.readline())

for s in f.readlines():
    n2 = int(s)
    
    #Найдём, на что оканчиваются n1 и n2
    last1 = abs(n1)%10
    last2 = abs(n2)%10

    #Основное условие задачи
    if last1%2==1 and last2%2==1 and last1==last2 and (n1 > 29980.700294117647 or n2 > 29980.700294117647):
        k += 1
        mx = max(mx, abs(n2-n1))

    n1=n2

print(k, mx)

В файле присутствуют отрицательные числа — не забудем использовать функцию модуля abs(). В основном условии союз ИЛИ нужно защитить скобками от союза И.


270198724




Задача (Полный квадрат)

В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число является полным квадратом некоторого натурального числа, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например для последовательности из пяти элементов: 9; 15; 23; -3; 4 - ответ 2 24.


Скачать файл


Решение:
f=open('17_3.txt')

k=0
mx=-10**10

n1=int(f.readline())

for s in f.readlines():
    n2=int(s)

    if (n1>0 and (round(n1 ** 0.5) ** 2) == n1) or (n2>0 and (round(n2 ** 0.5) ** 2) == n2) :
        k += 1
        mx=max(mx, n1+n2)
    
    n1=n2

print(k, mx)

Здесь мы извлекаем корень из числа с помощью возведения в степень 0.5. Округляем результат до целого числа с помощью функции round(). Эта функция округляет, примерно, как мы округляем в математике. А затем снова возводим в квадрат. Если мы получили изначальное число, значит, это число и есть полный квадрат некоторого натурального числа.


Возведение в степень в 0.5 работает и для отрицательных чисел. Т.к. в задаче имеют ввиду квадраты натуральных чисел, то мы работаем только с числами, которые больше нуля.


Ответ:
6018555




Задача (Простое число)

В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно. Определите количество пар последовательности, в которых хотя бы один элемент больше максимального простого числа в файле. В ответе запишите количество найденных пар, затем минимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.


Скачать файл

Решение:

Найдём максимальное простое число во всём файле.


def Pr(n):
    if n==1: return False
    for i in range(2, int(n**0.5)+1):
        if n%i==0:
            return False
    return True

f=open('17_2024_2.txt')

mx=-10**10

for s in f.readlines():
    x=int(s)
    if Pr(x):
        mx=max(mx, x)
print(mx)




Простое число — это такое число, которое имеет ровно 2 различных делителя: единицу и само это число. Функция Pr(n) проверят на простоту число n. Внутри функции пробегаемся с 2 до корня исследуемого числа. Если хотя бы встретится один делитель в этом диапазоне, то число не простое и функция возвращает False. В противном случае, возвращаем True. Почему достаточно идти до корня числа? - Читайте в статье по 25 Заданию.


Единица не является простым числом.


Получается число 99721.


f=open('17_2024_2.txt')

k=0
mn=10**10

n1=int(f.readline())

for s in f.readlines():
    n2 = int(s)
    if n1 > 99721 or n2 > 99721:
        k += 1
        mn = min(mn, n1+n2)
    n1=n2

print(k, mn)

Ответ:
22105792




Задача (Другая система счисления)

В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно. Определите количество пар последовательности, в которых оба элемента больше минимального числа во всей последовательности, которое в семеричной системе оканчивается на 3. В ответе запишите количество найденных пар, затем максимальную сумму квадратов элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.


Скачать файл

Решение:

Первым действием найдём минимальное число во всей последовательности, которое в семеричной системе оканчивается на 3.


f=open('17_2024_2.txt')

mn=10**10

for s in f.readlines():
    x=int(s)
    if x%7==3:
        mn=min(mn, x)
print(mn)




Первый остаток при делении на 7 — это и есть последняя цифра в семеричной системе. Об это мы говорили в 14 Задании.


Получается число 87.


f=open('17_2024_2.txt')

k=0
mx=-10**10

n1=int(f.readline())

for s in f.readlines():
    n2 = int(s)
    if n1 > 87 and n2 > 87:
        k += 1
        mx = max(mx, n1**2 + n2**2)
    n1=n2

print(k, mx)

Ответ:
499319774187428




Задача (Проверить первую цифру)

В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно. Определите количество пар последовательности, в которых оба элемента больше максимального числа во всей последовательности, которое начинается на цифру "1". В ответе запишите количество найденных пар, затем минимальную сумму элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.


Скачать файл

Решение:

Первым действием найдём максимальное число во всей последовательности, которое начинается на цифру "1".


f=open('17_2024_2.txt')

mx=-10**10

for s in f.readlines():
    x = int(s)
    if str(x)[0] == '1':
        mx=max(mx, x)

print(mx)




Получается число 19989. Здесь с помощью функции str() преобразовываем число x в строку и анализируем первый символ этой строки. Если он равен символу "1", то это число допускаем до "Царя горы".


f=open('17_2024_2.txt')

k=0
mn=10**10

n1=int(f.readline())

for s in f.readlines():
    n2 = int(s)
    if n1 > 19989 and n2 > 19989:
        k += 1
        mn = min(mn, n1+n2)
    n1=n2

print(k, mn)

319843629




Задача (Числа расположены в порядке возрастания)

В файле 17-3.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество троек элементов последовательности, в которых числа расположены в порядке возрастания, затем минимальную из разностей наибольшего и наименьшего элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.


Скачать файл


Решение:
f=open('17-3.txt')

k=0
rz=10**10

n1=int(f.readline())
n2=int(f.readline())

for s in f.readlines():
    n3 = int(s)

    if n1 < n2 < n3:
        k += 1
        mx = max(n1, n2, n3)
        mn = min(n1, n2, n3)
        rz = min(rz, mx-mn)

    n1=n2
    n2=n3


print(k, rz)

Ответ:
832460




Задача (Любой порядок элементов)

В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 9, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.


Скачать файл


Решение:

Первый способ (Красивый).

f = open('17.txt')

count_0 = 0
count_1 = 0
count_2 = 0
count_3 = 0
count_4 = 0
count_5 = 0
count_6 = 0
count_7 = 0
count_8 = 0


mx1_0 = 0
mx2_0 = 0
mx_1 = 0
mx_2 = 0
mx_3 = 0
mx_4 = 0
mx_5 = 0
mx_6 = 0
mx_7 = 0
mx_8 = 0


for s in f.readlines():
    n=int(s)

    if n%9==0:
        count_0 = count_0 + 1

        if n>mx1_0:
            if n>mx2_0:
                mx1_0 = mx2_0
                mx2_0 = n
            else:
                mx1_0 = n

    if n%9==1:
        count_1 = count_1 + 1
        mx_1 = max(mx_1, n)

    if n%9==2:
        count_2 = count_2 + 1
        mx_2 = max(mx_2, n)

    if n%9==3:
        count_3 = count_3 + 1
        mx_3 = max(mx_3, n)

    if n%9==4:
        count_4 = count_4 + 1
        mx_4 = max(mx_4, n)

    if n%9==5:
        count_5 = count_5 + 1
        mx_5 = max(mx_5, n)

    if n%9==6:
        count_6 = count_6 + 1
        mx_6 = max(mx_6, n)

    if n%9==7:
        count_7 = count_7 + 1
        mx_7 = max(mx_7, n)

    if n%9==8:
        count_8 = count_8 + 1
        mx_8 = max(mx_8, n)


count = (count_1*count_8) + (count_2*count_7)  + (count_3*count_6) + (count_4*count_5) + (count_0*(count_0-1)//2)
mx = max(mx_1 + mx_8, mx_2 + mx_7, mx_3 + mx_6, mx_4 + mx_5, mx1_0 + mx2_0)

print(count, mx)




Здесь мы ищем количество элементов, у которых остаток при делении на 9 равен нулю, единице, двойке, ... и до 8. Подсчитываем эти данные соответственно в переменные count_0, count_1, count_2 ... и т.д.


Так же находим максимальное число, которое имеет при делении на 9 остаток равный единице, двойке, ... и т.д. Для чисел, которые имеют остаток при делении на 9 ноль, находим два максимальных числа.


После того, как результаты находятся в нужных переменных, можно вычислить ответ к задаче.


Если, к примеру, взять число для которого остаток равен 1 и число для которого остаток равен 8, то их сумма будет делится на 9. Найдём количество пар, если нам известно количество и тех, и тех чисел.


ЕГЭ по информатике 2022 - задание 17 (Числа не по порядку)

Значит, просто нужно перемножить два числа, к примеру, count_1*count_8.


Для чисел, которые делятся на 9 (т.е. остаток равен нулю), количество пар считается немного по-другому. Такие числа можно суммировать между собой, всё равно сумма тоже будет делится на 9. Путь есть у нас количество чисел count_0, которые делятся на 9. Тогда найдём количество пар, которые можно составить из этих элементов.


Здесь вспомним метод умножения, о котором было написано в этой статье.


ЕГЭ по информатике 2022 - задание 17 (Числа не по порядку)

Найдём количество таких пар, если каждый элемент можно использовать 1 раз. Получается count_0*(count_0-1). Но т.к. в нашем случае пара, когда элементы находятся в одном порядке и в обратном, является одной и той же, то нужно это количество поделить на 2. Т.е количество пар будет (count_0*(count_0-1))/2.





Второй способ (Перебор).

f = open('17.txt')

count=0
mx=0

a = []

#Считываем все числа в массив a
for s in f.readlines():
    n = int(s)
    a.append(n)

# Перебираем все варианты и подсчитываем пары, отвечающие условию задачи.
for i in range(0, len(a)):
    for j in range(i+1, len(a)):
        if (a[i]+a[j])%9==0:
            count = count + 1
            mx = max(a[i]+a[j], mx)
    

print(count, mx)

В этом решении сначала считываем все числа в массив a.


Далее берём число и начинаем его комбинировать со всеми числами, которые стоят после этого числа. Таким образом, мы переберём все возможные комбинации, и у нас не будут пары повторяться.


Ответ:
555363519998








31-01-2022 в 12:16:27






Поддержать сайт:


Похожая статья:

ЕГЭ по информатике 2021 - Задание 15 (Простым языком)

Сегодняшний урок посвящён 15 заданию из ЕГЭ по информатике 2021. Темой...

Категория: Информатика  Подкатегория: ЕГЭ
Дата: 06-10-2020 в 07:14:09 5


Комментарии:

Dwayne "The rock" Johnson 21-02-2022 в 08:41:36

я молодец
Alena 02-03-2023 в 08:38:28

Лена лучшая, поставьте ей 5 >:D
Helena Bebra 17-04-2023 в 08:51:18

Соре, Рома, забираю свои слова назад. Ты лучший, онли факты
Roma Scam 17-04-2023 в 08:53:12

Поняла, для чего. быть сильною должна, руку дай и веди, за собой!!! Димон Slayer Мясорубка
Cryщий Бизнес Man 17-04-2023 в 08:53:33

Полина крутая, это факт
Полнке 17-04-2023 в 08:56:14

Ты гений, нет слов
John Sina 14-05-2023 в 10:37:36



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота. Расположите картинки горизонтально:




Нажимая кнопку Отправить, Вы соглашаетесь с политикой конфиденциальности сайта.