25 задание ЕГЭ по информатике (вторая часть)

25 задание ЕГЭ по информатике (вторая часть)

25-е задание: «Программная обработка целочисленной информации» Уровень сложности — высокий, Требуется использование специализированного программного обеспечения — да, Максимальный балл — 2, Примерное время выполнения — 20 минут.

Проверяемые элементы содержания: Умение создавать собственные программы (10–20 строк) для обработки целочисленной информации

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

Типичные ошибки и рекомендации по их предотвращению:

"Часто бывает, что увлекшись написанием решения, экзаменуемый совершает ошибки в простых ситуациях: организация ввода-вывода, описание и инициализация переменных, обработка массива (выход за границу) и т.д. Эти ошибки могут стоить Вам нескольких баллов, старайтесь их не допускать"

Алгоритмизация и программирование

Для решения задания требуется вспомнить темы:

Решение 25 заданий ЕГЭ по информатике

Делители числа

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [126849; 126871], числа, имеющие ровно 4 различных делителя. Выведите эти четыре делителя для каждого найденного числа в порядке возрастания.

    ✎ Решение (неоптимизированный вариант, метод полного перебора):

begin var divCount := 4; for var n := 126849 to 126871 do begin var divs := new List<integer>; for var d := 1 to n do if n mod d = 0 then begin divs.Add(d); if divs.Count > divCount then break; end; if divs.Count = divCount then begin divs.Sort(); Println(divs); end; end; end.

for n in range(126849,126871+1): divs = [] # чистим список делителей for d in range(1,n+1): # if n % d == 0: divs = divs + [d] # добавляем делитель в список if len(divs) > 4: break if len(divs) == 4: print(*divs)

✎ Решение (оптимизированный вариант):

begin var divCount := 4; for var n := 126849 to 126871 do begin var divs := new List<integer>; var d := 1; while d * d <= n do // можно цикл for var d := 1 to round(sqrt(n)) do begin if n mod d = 0 then begin divs.Add(d); if d * d <> n then divs.Add(n div d); if divs.Count > divCount then break; end; d := d+1; end; if divs.Count = divCount then begin divs.Sort(); Println(divs); end; end; end.

# import math # для квадратного корня числа (sqrt) divCount = 4 # нужное количество делителей for n in range(126849,126871 + 1): divs = [] # чистим список делителей d = 1 # вместо while можно цикл for d in range(1,round(math.sqrt(n))): while d*d <= n: # перебор делителей if n % d == 0: divs.append(d) # добавляем делитель в список if d != n//d: # если делитель - не точный квадратный корень n divs.append(n//d) if len(divs) > divCount: break d+=1 if len(divs) == divCount: divs.sort() print(divs)

✎ Решение: Генерация списка делителей. Общая идея:

for n in range(126849, 126871+1): divs = [d for d in range(1, n+1) if n % d == 0] if len(divs) == 4: print( *divs )

Ответ:

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [164700; 164752], числа, имеющие ровно 6 различных делителей. Выведите эти делители для каждого найденного числа в порядке возрастания.

    ✎ Решение (оптимизированный вариант):

begin var divCount := 6; for var n := 164700 to 164752 do begin var divs := new List<integer>; for var d := 1 to round(sqrt(n)) do if n mod d = 0 then begin divs.Add(d); if d * d <> n then divs.Add(n div d); if divs.Count > divCount then break; end; if divs.Count = divCount then begin divs.Sort(); Println(divs); end; end; end.

import math # для квадратного корня sqrt divCount = 6 # нужное количество делителей for n in range(164700, 164752 + 1): divs = [] # чистим список делителей for d in range(1,round(math.sqrt(n))): # перебор делителей if n % d == 0: divs.append(d) # добавляем делитель в список if d != n//d: divs.append(n//d) if len(divs) > divCount: break if len(divs) == divCount: divs.sort() print(divs)

✎ Решение: Генерация списка делителей. Общая идея:

for n in range(164700, 164752+1): divs = [d for d in range(1, n+1) if n % d == 0] if len(divs) == 6: print( *divs )

Ответ:

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [190201; 190230], числа, имеющие ровно 4 различных делителя. Выведите эти четыре делителя для каждого найденного числа в порядке убывания.

    ✎ Решение (неоптимизированный вариант, метод полного перебора):

begin var divs := new integer[4]; for var n := 190201 to 190230 do begin var i := 0; // для индекса массива for var d := 1 to n do begin if n mod d = 0 then begin if i < 4 then divs[i] := d; inc(i); end; if i > 4 then break; end; if i = 4 then begin println(divs.Reverse()) end; end; end.

for n in range(190201,190230+1): divs = [] # чистим список делителей for d in range(1,n+1): # if n % d == 0: divs = divs + [d] # добавляем делитель в список if len(divs) > 4: break if len(divs) == 4: divs.reverse() print(*divs)

✎ Решение (оптимизированный вариант):

begin var divCount := 4; for var n := 190201 to 190230 do begin var divs := new List<integer>; for var d := 1 to round(sqrt(n)) do if n mod d = 0 then begin divs.Add(d); if d * d <> n then divs.Add(n div d); if divs.Count > divCount then break; end; if divs.Count = divCount then begin divs.Sort(); divs.Reverse(); Println(divs); end; end; end.

import math # для квадратного корня sqrt divCount = 4 # нужное количество делителей for n in range(190201, 190230 + 1): divs = [] # чистим список делителей for d in range(1,round(math.sqrt(n))): # перебор делителей if n % d == 0: divs.append(d) # добавляем делитель в список if d != n//d: divs.append(n//d) if len(divs) > divCount: break if len(divs) == divCount: divs.sort() divs.reverse() print(divs)

✎ Решение: Генерация списка делителей. Общая идея:

for n in range(190201, 190230+1): divs = [d for d in range(1, n+1) if n % d == 0] if len(divs) == 4: divs.reverse() # реверсируем (по убыванию) print( *divs )

Ответ:

📹 Видеорешение на RuTube здесь

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [190201; 190280], числа, имеющие ровно 4 различных ЧЁТНЫХ делителя. Выведите эти четыре делителя для каждого найденного числа в порядке убывания.

    ✎ Решение (неоптимизированный вариант, метод полного перебора):

begin var divs := new integer[4]; for var n := 190201 to 190280 do begin var i := 0; // для индекса массива for var d := 1 to n do begin if (n mod d = 0) and (d mod 2 = 0) then begin if i < 4 then divs[i] := d; inc(i); end; if i > 4 then break; end; if i = 4 then begin println(divs.Reverse()) end; end; end.

for n in range(190201,190280+1): divs = [] # чистим список делителей for d in range(1,n+1): # if n % d == 0 and d%2==0: divs = divs + [d] # добавляем делитель в список if len(divs) > 4: break if len(divs) == 4: divs.reverse() print(*divs)

✎ Решение: Генерация списка делителей.

for n in range(190201, 190280+1): divs = [d for d in range(1, n+1) if n % d == 0 and d % 2 == 0] if len(divs) == 4: divs.reverse() print( *divs )

Ответ:

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [394441; 394505], числа, имеющие максимальное количество различных делителей. Если таких чисел несколько, то найдите минимальное из них. Выведите количество делителей найденного числа и два наибольших делителя в порядке убывания.

    ✎ Решение (неоптимизированный вариант, метод полного перебора):

begin var max := 0; var divsMax := new List<integer>; for var n := 394441 to 394505 do begin var divs := new List<integer>; for var d := 1 to n do if n mod d = 0 then divs.Add(d); if divs.Count > max then begin max := divs.Count; divsMax := divs; end; end; divsMax.Reverse(); print(max, divsMax[0], divsMax[1]) end.

maxim = 0 # нужное количество делителей divsMax = [] for n in range(394441, 394505 + 1): divs = [] # чистим список делителей for d in range(1,n+1): # перебор делителей if n % d == 0: divs.append(d) # добавляем делитель в список if len(divs) > maxim: maxim = len(divs) divsMax = divs divsMax.reverse() print(maxim,divsMax[0],divsMax[1])

✎ Решение (Генерация списка делителей):

maxim=0 divsmax=[] for n in range(394441, 394505+1): divs = [d for d in range(1, n+1) if n % d == 0] if len(divs) > maxim: maxim = len(divs) divsmax = divs # сохраняем делители для числа с макс кол-вом дел-ей divsmax.reverse() print(maxim, divsmax[0], divsmax[1])

Ответ: 48 394450 197225

Простые числа

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [3532000; 3532160], простые числа. Выведите все найденные простые числа в порядке убывания, слева от каждого числа выведите его номер по порядку.

    ✎ Решение (неоптимизированный вариант, метод полного перебора):

begin var count := 0; for var n := 3532160 downto 3532000 do // цикл с конца begin var flag := true; for var d := 2 to n - 1 do // перебор делителей, начиная с двух до n-1 begin if n mod d = 0 then begin // есть делитель помимо единицы и самого n flag := false; // число не простое break; end; end; if flag = true then // если число простое begin inc(count); Println(count, n); end; end; end.

count = 0 for n in range(3532160, 3532000-1, -1): # цикл с конца и с шагом (-1) flag = True for d in range(2, n): # перебор делителей, начиная с двух if n % d == 0: # есть делитель помимо единицы и самого n flag = False # число не простое break if flag == True: # число простое count+=1 print(count , n)

✎ Решение (оптимизированный вариант):

begin var count := 0; for var n := 3532160 downto 3532000 do // цикл с конца begin var flag := true; var d := 2; while d * d <= n - 1 do // перебор делителей, начиная с двух begin if n mod d = 0 then begin // есть делитель помимо единицы и самого n flag := false; // число не простое break; end; d := d + 1; end; if flag = true then // если число простое begin inc(count); Println(count, n); end; end; end.

count = 0 for n in range(3532160, 3532000-1, -1): # цикл с конца и с шагом (-1) flag = True d = 2 while d*d <= n-1: # перебор делителей, начиная с двух if n % d == 0: # есть делитель помимо единицы и самого n flag = False # число не простое break d+=1 if flag == True: # число простое count+=1 print(count , n)

Ответ:

Задания прошлых лет для тренировки (до 2021)

Задачи с поэлементной обработкой массива

Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество элементов массива НЕ кратных 3.

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но использовать все описанные переменные не обязательно.

const N = 20; var i,j,k:integer; a:array [1..N] of integer; begin for i:=1 to N do readln(a[i]); … end.

✍ Решение:

  • в цикле со счетчиком i запрашиваются значения элементов массива, т.е. формируется массив;
  • из постановки задания видим, что необходимо найти количество чего-то, это значит, что нужно использовать переменную счетчик;
  • объявлены три целочисленных переменных: i, j, k; переменная i использована в первом цикле, значит для счетчика можно взять переменную k;
  • счетчик всегда нужно обнулять, поэтому следующим оператором будет:

for j:=1 to N do if a[j] mod 3 <> 0 then

Результат:

k:=0; for j:=1 to N do if a[j] mod 3 <> 0 then inc(k); writeln(k);

Смотрите видео с подробным объяснением и разбором данного 25 задания:

📹 Видеорешение на RuTube здесь

Задачи на обработку элементов массива с последующей заменой

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на одном из языков программирования алгоритм, который находит количество элементов массива, больших 100 и при этом кратных 5, а затем заменяет каждый такой элемент на число, равное найденному количеству. Гарантируется, что хотя бы один такой элемент в массиве есть. В качестве результата необходимо вывести измененный массив, каждый элемент массива выводится с новой строчки.

Например, для массива из шести элементов: 4 115 7 195 25 106 программа должна вывести числа 4 2 7 2 25 106

Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

const N = 30; var a: array [1..N] of longint; i, j, k: longint; begin for i := 1 to N do readln(a[i]); . end.

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

✍ Решение:

    Решение на языке Паскаль:

k := 0; for i := 1 to N do if (a[i] > 100) and (a[i] mod 5 = 0) then k:=k+1; for i := 1 to N do begin if (a[i] > 100) and (a[i] mod 5 = 0) then a[i] := k; writeln(a[i]) end

Дан массив, содержащий неотрицательные целые числа. Необходимо вывести:

Например, для массива из шести элементов: 4 6 12 17 3 8 ответом будет 12 — наибольшее чётное число, поскольку чётных чисел в этом массиве больше

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

# допускается также использовать # целочисленные переменные j, k, m a = [] n = 2000 // менять значение n нельзя for i in range(0, n): a.append(int(input()))

✍ Решение:

    Решение на языке Python:

a = [] n = 2000 // менять значение n нельзя for i in range(0, n): a.append(int(input())) j = 0 k = 0 m = 0 for i in range(0, n): if a[i]%2 == 0: j+=1 else: k+=1 if k>j: j = 0 for i in range(0, n): if a[i]>j and a[i] % 2 != 0: j = a[i] print(j) else: for i in range(0, n): if a[i]>m and a[i] % 2 == 0: m = a[i] print(m)

Задачи на обработку пар элементов массива (два подряд идущих)

Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых одно из чисел двузначное. В данной задаче под парой подразумевается два подряд идущих элемента массива.

Например, для массива из семи элементов: 13; 323; 12; 33; 117 — ответ: 4.

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

const N = 40; var a: array [1..N] of integer; i, j, k: integer; begin for i := 1 to N do readln(a[i]); . end.

k := 0; for i := 1 to N - 1 do if ((a[i] < 100) and (a[i] > 9)) or ((a[i + l] < 100) and (a[i + 1] > 9)) then inc(k); writeln(k);

Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от -10 000 до 10 000 включительно. Опишите алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых сумма элементов делится на 2, но не делится на 4. В данной задаче под парой подразумевается два подряд идущих элемента массива.

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

# допускается также использовать # две целочисленные переменные # j и k a = [] n = 20 for i in range(0, n): a.append(int(input()))

    Проанализируем данный фрагмент кода на языке Python:

for i in range(0, n-1): j = a[i] + a[i+1] if j%2 == 0 and j%4 != 0:

. if j%2 == 0 and j%4 != 0: k+=1

a = [] n = 20 for i in range(0, n): a.append(int(input())) k = 0 for i in range(0, n - 1): j = a[i] + a[i + 1] if j%2 == 0 and j%4 != 0: k += 1 print(k)

Задачи на обработку трёх подряд идущих элементов массива (тройки элементов массива)

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

Например, для массива из семи элементов: 2; 2; 2; 4; 4; 4; 4 — ответ: 3.

Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

const N=40; var a: array[1..N] of integer; i, j, k:integer; begin for i:=1 to N do readln(a[i]); . end.

✍ Решение:

  • из постановки задания видим, что необходимо искать количество чего-то, это значит, что нужно использовать переменную счетчик; возьмем для нее объявленную переменную k;
  • счетчик всегда нужно сначала обнулять, поэтому следующим оператором будет:

if (a[i]=a[i+1]) and (a[i]=a[i+2]) then inc(k);

Результат:

for i:=1 to N-2 do if (a[i]=a[i+1]) and (a[i]=a[i+2]) then inc(k); writeln(k);

📎📎📎📎📎📎📎📎📎📎