Задание 17 ЕГЭ информатика по теме «Обработка целочисленной информации»

На уроке рассмотрен материал для подготовки к ЕГЭ по информатике, разбор 17 задания. Объясняется тема о программной обработке числовой информации.

ЕГЭ по информатике 17 задания объяснение

17-е задание: «Программная обработка целочисленной информации»
Уровень сложности — повышенный,
Требуется использование специализированного программного обеспечения — да,
Максимальный балл — 1,
Примерное время выполнения — 15 минут.
  
Проверяемые элементы содержания: Умение создавать собственные программы (20–40 строк) для обработки целочисленной информации

Выполнение 17 задания ЕГЭ

Плейлист видеоразборов задания на YouTube:

Задание демонстрационного варианта 2022 года ФИПИ


Числовой отрезок, числа которого делятся/не делятся на n

17_1: Демоверсия варианта ЕГЭ по информатике 2021, ФИПИ:

Рассматривается множество целых чисел, принадлежащих числовому отрезку [1016; 7937], которые делятся на 3 и не делятся на 7, 17, 19, 27. Найдите количество таких чисел и максимальное из них.
В ответе запишите два целых числа: сначала количество, затем максимальное число.

! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

  
Типовые задания для тренировки

Ответ: 1568 | 7935
 
Видео  
✍ Решение:

    ✎ Решение с использованием программирования:

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    var
      i, k, max: integer;
     
    begin
      k := 0;
      max := 0;
      for i := 1016 to 7937 do 
      begin
        if (i mod 3 = 0) and (i mod 7 > 0) and (i mod 17 > 0) and (i mod 19 > 0) and (i mod 27 > 0) then
        begin
          max:= i;
          inc(k);
        end;
      end;
      writeln(k, ' ', max)
    end.

    PascalABC.NET (решение со списком):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    begin            
      var l:=new List<integer>;
      for var n:=1016 to 7937 do
        if (n mod 3 = 0) and (n mod 7 <> 0) and 
           (n mod 17 <> 0) and (n mod 19 <> 0) and 
           (n mod 27 <> 0) then begin
             l.Add(n);
           end;
      print(l.Count,l.Max)
    end.

    PascalABC.NET (LINQ):

    1
    2
    3
    4
    
    begin
     var s := Range( 1017, 7937, 3).Where( i -> not i.DivsAny(7, 17, 19, 27) );
     print( s.Count, s.Max );            
    end.

    Python:

    1
    2
    3
    
    a = [n for n in range(1016,7937+1) 
         if (n%3==0 and n%7!=0 and n%17!=0 and n%19!=0 and n%27!=0)]
    print(len(a),max(a))
    Список a формируем, используя генератор списка: то есть в список попадут только те числа из диапазона [1016,7937], которые удовлетворяют всем перечисленным условиям: n%3==0 (число делится на 3), n%7!=0 (число не делится на 7) и т.п.

    C++:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    #include <iostream>
    int main()
    {
      int count = 0;
      int maxGood = 0;
      for(int n=1016; n<=7937; n++)
        if( (n % 3 == 0) and (n % 7 != 0) and 
            (n % 17 != 0) and (n % 19 != 0) and (n % 27 != 0) ) {
          maxGood = n;    
          count += 1;
          }  
      std::cout << count << " " << maxGood;
    }

    ✎ Решение с помощью Excel:

  • Первое значение диапазона введем в ячейку A1:
  • Используем прогрессию для заполнения всего диапазона числами. Для это выберите вкладку Главная и щелкните по кнопке Прогрессия:
  • Столбец B будем использовать для поиска чисел, которые делятся на 3. Для этого в ячейку B1 введите формулу с рисунка:
  • Двойным щелчком по маркеру заполнения скопируйте формулу на весь столбец:
  • Столбец С будем использовать для поиска чисел, которые НЕ делятся на 7. Для этого в ячейку С1 введите формулу с рисунка:
  • Заполните весь столбец двойным щелчком по маркеру заполнения.
  • Cтолбцы D, E, F таким же образом будем использовать для поиска чисел столбца А, которые не делятся на 17, 19 и 27
  • Для поиска всех истинных значений используем столбец G. В ячейку G1 введите функцию ЕСЛИ: если все значения ячеек в столбцах B-F в этой строке истинны, выводим число из А1, иначе – пустую строку:

  • Заполните весь столбце, используя маркер автозаполнения.

  • Ячейку H1 будем использовать для подсчета таких чисел, которые удовлетворяют всем условиям, т.е. для подсчета непустых ячеек столбца G:
  • Ячейку H2 будем использовать для подсчета такого наибольшего числа:

Видеоразбор 17 задания ЕГЭ:
📹 YouTube здесь

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


Работа с цифрами числа в n-й системе счисления

17_2:

Рассматривается множество целых чисел, принадлежащих числовому отрезку [3712; 8432], которые удовлетворяют следующим условиям:
− запись в двоичной и четверичной системах счисления заканчивается одинаковой цифрой;
− кратны 13, 14 или 15.

Найдите количество таких чисел и минимальное из них.

! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

  
Типовые задания для тренировки

Ответ: 471   3720
✍ Решение:

✎ Решение с использованием программирования:

Паскаль:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
 var k, n, min:integer;
 
begin
  k:=0; min:=8433;
  for n:= 3712 to 8432 do
    if (n mod 2 = n mod 4) and ((n mod 13=0) or (n mod 14=0) or (n mod 15=0)) then
      begin
        if min>n then
        min:=n;
        k:=k+1;
      end;
      Writeln (k,' ',min);
End.

PascalABC.NET (со списком):

1
2
3
4
5
6
7
8
9
begin
  var l := new List<integer>;
  for var n := 3712 to 8432 do
    if (n mod 2 = n mod 4) and ((n.divs(13)) or (n.divs(14)) or (n.divs(15))) then
    begin
      l.add(n)
    end;
  print(l.Count, l.Min)
end.

PascalABC.NET (запросы LINQ):

1
2
3
4
5
6
7
begin
 var s := Range( 3712, 8432)
   .Where(i -> ((i mod 13=0) or (i mod 14=0) or (i mod 15=0)) and (i mod 2 = i mod 4));
    // или: .Where( i -> (i.DivsAny(13,14,15)) and (i mod 2 = i mod 4));
 s.Count.Print;
 s.Min.Print;  
end.

Python:

1
2
L = [x for x in range(3712, 8432+1) if (x % 13 == 0 or x % 14 == 0 or x % 15 == 0) and ( x % 2 == x % 4)]
print(len(L),' ',L[0])
Формируем список (массив) L только из подходящих элементов, то есть удовлетворяющих всем, перечисленным в задании, условиям. Затем выводим длину списка (len(L)), т.е. найденное количество таких чисел, и нулевой элемент, он же минимальный, поскольку числа упорядочены по возрастанию (L[0])

C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
int main()
{
	int count = 0;
	int min = 8433;
	for (int n = 3712; n <= 8432; n++)
		if (((n % 2 == n % 4) && ((n % 13 == 0) || (n % 14 == 0) || (n % 15 == 0))) )
		{
			if (n < min) min = n;
			count += 1;
		}
	std::cout << count << " " << min;
}

✎ Решение с помощью Excel:

  • Первое значение диапазона введем в ячейку A1:
  • Используем прогрессию для заполнения всего диапазона числами. Для это выберите вкладку Главная и щелкните по кнопке Прогрессия:
  • Столбец B будем использовать для поиска чисел, которые кратны 13, 14 или 15. Для этого в ячейку B1 введите формулу с рисунка:
  • Двойным щелчком по маркеру заполнения скопируйте формулу на весь столбец:
  • Столбец С будем использовать для поиска чисел, запись которых в двоичной и четверичной системах счисления заканчивается одинаковой цифрой. Для этого в ячейку С1 введите формулу с рисунка:
  • Заполните весь столбец двойным щелчком по маркеру заполнения.
  • Для поиска всех истинных значений используем столбец D. В ячейку D1 введите функцию ЕСЛИ: если все значения ячеек в столбцах B, C в этой строке истинны, выводим число из А1, иначе – пустую строку:
  • Заполните весь столбце, используя маркер автозаполнения.
  • Ячейку E1 будем использовать для подсчета таких чисел, которые удовлетворяют всем условиям, т.е. для подсчета непустых ячеек столбца D:
  • Ячейку E2 будем использовать для подсчета такого наименьшего числа (или просмотрите столбец D визуально и найдите первое значение):

  • 17_3:

    Рассматривается множество целых чисел, принадлежащих числовому отрезку [1000; 9999], запись которых в пятеричной системе имеет не менее 6 цифр и заканчивается на 21 или 23.

    Найдите количество таких чисел и минимальное из них.

    ! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

      

    Ответ: 550   3136
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (со списком):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    uses school;
    begin
      var l := new List<integer>;
      for var n := 1000 to 9999 do
      begin
        var str := n.ToString.ToBase(5);
        if (str.Length = 6) and (str[str.length - 1] = '2')
           and ((str[str.length] = '1') or (str[str.length] = '3')) then
          l.add(n)
      end;
      print(l.Count, l.Min)
    end.

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    5
    6
    
    ### uses school;
    var s := Range(1000, 9999)
       .Where(i -> (i.ToString.ToBase(5).Length=6) and (i div 5 mod 5 = 2)
           and((i mod 5 = 1) or (i mod 5 = 3)));
    s.Count.Print;
    s.Min.Print;

    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    numb=''
    result=list()
    for i in range(1000, 9999+1):
        if ((i // 5) % 5 ==2) and (( i % 5 == 1) or ( i % 5 == 3)):
            while i>=5: #Цикл перевода числа из 10-й в 5-ю сс
                s=i%5
                numb=str(s)+numb
                i=i//5
                if i<5:
                    numb=str(i)+numb
            n=len(numb)
            if n>5:
                result.append(numb) # список из чисел в 5-й с.с
            numb=""
    kolvo=len(result)
    minNumb=int(min(result),5) # перевод в десятичную с.с и поиск min
    print(kolvo,minNumb)
    17_4:

    Рассматривается множество целых чисел, принадлежащих числовому отрезку [2495; 7083], которые удовлетворяют следующим условиям:

  • запись в шестнадцатеричной системе счисления заканчивается на 1A или 1F;
  • не кратны 5 и 9.
  • Найдите количество таких чисел и минимальное из них.

    ! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

      

    Ответ: 26 2586
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (со списком):

    1
    2
    3
    4
    5
    6
    7
    8
    
    begin
      var l := new List<integer>;
      for var n := 2495 to 7083 do
        if ((n mod 16 = 10) or (n mod 16 = 15)) and (n div 16 mod 16 = 1) and (n mod 5 <> 0) and (n mod 9 <> 0) then begin
          l.Add(n);
        end;
      print(l.Count,l.Min)
    end.

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    5
    
    ### uses school;
    var s := Range(2495, 7083)
       .Where( i -> ((i mod 16 = 10)or(i mod 16 =15))and(i div 16 mod 16 =1)and(i mod 5 <> 0)and(i mod 9 <> 0));
    s.Count.Print;
    s.Min.Print;

    Python:

    1
    2
    3
    
    L = [x for x in range(2495, 7083+1) 
         if (x % 5 != 0 and x % 9 != 0 and x // 16 % 16 == 1 and (x % 16 == 10 or x % 16 == 15))]
    print(len(L),' ',L[0])
    17_5:

    Рассматривается множество целых чисел, принадлежащих числовому отрезку [8800; 55535], которые удовлетворяют следующим условиям:

  • а) произведение разрядов больше 35;
  • б) один из разрядов равен 7.
  • Найдите наибольшее из таких чисел и их количество.

    ! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

      

    Ответ: 55527 10958
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (со списком):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    ##
    var l := new List<integer>;
    for var n := 8800 to 55535 do
    begin
      var p := 1;
      var f7 := false;
      var numb := n;
      while numb > 0 do
      begin
        var dig := numb mod 10;
        if dig = 7 then f7 := true;
        p *= dig;
        numb := numb div 10;
      end;
      if (f7) and (p > 35) then l.add(n)
    end;
    print(l.Max, l.count);

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    5
    
    ##
    uses school;
    var s:=(8800..55535)
       .Where(i -> (i.Digits.Product > 35) and (7 in i.Digits));
    Println(s.max, s.Count )

    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    count = 0
    m = 0
    for i in range(8800, 55535+1):
        x = i
        p = 1
        while x>0:
            p*=x % 10
            x//=10
        if p>35 and p % 7 == 0:
            count+=1
            m=i
    print(m, count)

    Имеют n делителей

    17_6:

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

    ! Для выполнения этого задания можно написать программу или воспользоваться редактором электронных таблиц

      

    Ответ: 18021 76432
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (со списком):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    ##
    var l := new List<integer>;
    for var i := 12356 to 76435 do
    begin
      var n := 0;
      for var j:=1 to i do
      begin
        if i.Divs(j) then n+=1;
      end;
      if n > 15 then l.Add(i);
    end;
    print(l.Count, l.max)

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    5
    
    ##
    uses school;
    var s:=(12356..76435)
      .Where(i ->i.Divisors.Count>15);
    Print(s.Count, s.Max);

    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    start, end = 12356, 76435
    def valid( x ):
      count = 2
      q = round(x**0.5)
      if q*q == x:
        count += 1
        q -= 1
      for i in range(2, q+1):
        if x % i == 0:
          count += 2
      return count > 15
    count = 0
    ma = 0
    for x in range(start, end+1):
      if valid(x):
        count += 1
        ma = x
    print( count, ma )

    Работа с файлом

    17_7:

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

    Например, в последовательности 7; 3; 10; 4; 7; -2; 10; -12; 3 два элемента равны максимальному, позиция первого из них — 3. Ответом для данного примера будет пара чисел 2 и 3.

    * Автор: В. Шубинкин

    Ответ: 9 26
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (эффективное решение за счет одного цикла):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    ##
    var a := ReadLines('17-2.txt').Select(t -> t.ToInteger).ToArray;
    var m := integer.MinValue;
    var count := 0;
    var pos := 0;
    for var i:=0 to a.Length-1 do
    begin
      if a[i] > m then 
        begin
          m := a[i];
          pos := i;
          count := 0
        end;
      if a[i] = m then count += 1;
    end;
    print(count, pos)

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    
    ##
    var a := ReadLines('17-2.txt').Select(t -> t.ToInteger).ToArray;
    var m := a.Max;
    print(a.CountOf(m), a.IndexMax + 1)

    Python:

    1
    2
    3
    4
    5
    
    with open('17-2.txt') as f:
        a = [int(x) for x in f.readlines()]
     
    max_el = max(a)
    print(a.count(max_el), a.index(max_el) + 1)

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

    17_8:

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

    Например, для последовательности -45; 14; 22; -21; 34 ответом будет пара чисел: 3 и -31.

    * Автор: В. Шубинкин

    Ответ: 2510 -19677
      
    ✍ Решение:

    ✎ Решение с использованием программирования:
    PascalABC.NET (классическое решение):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var a := ReadLines('17-1.txt').Select(t -> t.ToInteger).ToArray;
    var pair_count := 0;
    var minS := 20000;
    for var i := 0 to a.High - 1 do
      if (a[i] mod 7 = 0) and (a[i + 1] mod 17 <> 0)
          or (a[i + 1] mod 7 = 0) and (a[i] mod 17 <> 0) then
      begin
        pair_count += 1;
        minS := min(minS, a[i] + a[i + 1])    
      end;
    println(pair_count, minS)

    PascalABC.NET (запросы LINQ):

    1
    2
    3
    4
    5
    6
    7
    8
    
    ##
    var data := ReadLines('17-1.txt').Select(x -> x.ToInteger); // работаем с последовательностью
    var pairs := data.NWise(2)
     .Where(\(a,b)->(a.Divs(7) and (not b.Divs(17)) 
        or ((b.Divs(7) and (not a.Divs(17))))));
    pairs.Count.Print;  
    var sums:=pairs.Select(\(a,b)->a+b);  
    sums.min.print;

    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    count = 0
    min_s = 20000
    with open('17-1.txt') as f:
        a = int(f.readline())
        for line in f.readlines():
            b = int(line)
            if (a % 7 == 0 and b % 17 != 0
                or b % 7 == 0 and a % 17 != 0):
                count += 1
                min_s = min(min_s, a + b)
            a = b
    print(count, min_s)

    3 комментария для “Задание 17 ЕГЭ информатика по теме «Обработка целочисленной информации»”

    1. В задании 17_2: 17 опечатка
      Программа с++ строка 9
      if (min == 8433) min = n;

      надо
      if (n<min) min = n;

    2. Вот код к последней задаче на привычном паскале, если кому надо.

      function per(ch,osn:int64):int64;
      var i,r,r1:int64;s:array [1..100] of int64;
      begin
      r:=1;
      r1:=1;
      while (ch>0) do begin
      s[r]:=ch mod osn;
      ch:=ch div osn;
      r:=r+1;
      end;
      for i:=1 to r do begin
      ch:=ch+s[i]*r1;
      r1:=r1*10;
      end;
      per:=ch;
      end;
      var i,count,min:int64;
      begin
      count:=0;
      min:=10000;
      for i:=1000 to 9999 do begin
      if (per(i,5)>99999) and (per(i,5)i) then min:=i;
      end;
      end;
      writeln(count,’ ‘,min);
      end.

      1. Сайт немного обрезал программу. Вот основное тело.

        begin
        count:=0;
        min:=10000;
        for i:=1000 to 9999 do begin
        if (per(i,5)>99999) and (per(i,5)i) then min:=i;
        end;
        end;
        writeln(count,’ ‘,min);
        end.

    Обсуждение закрыто.