Содержание:
ЕГЭ по информатике 17 задания объяснение
Уровень сложности — повышенный,
Требуется использование специализированного программного обеспечения — да,
Максимальный балл — 1,
Примерное время выполнения — 15 минут.
Проверяемые элементы содержания: Умение создавать собственные программы (20–40 строк) для обработки целочисленной информации
Выполнение 17 задания ЕГЭ
Плейлист видеоразборов задания на YouTube:
Задание демонстрационного варианта 2022 года ФИПИ
Числовой отрезок, числа которого делятся/не делятся на n
Рассматривается множество целых чисел, принадлежащих числовому отрезку [1016; 7937], которые делятся на 3 и не делятся на 7, 17, 19, 27. Найдите количество таких чисел и максимальное из них.
В ответе запишите два целых числа: сначала количество, затем максимальное число.
Ответ: 1568 | 7935
Видео
✍ Решение:
-
✎ Решение с использованием программирования:
- Первое значение диапазона введем в ячейку A1:
- Используем прогрессию для заполнения всего диапазона числами. Для это выберите вкладку Главная и щелкните по кнопке Прогрессия:
- Столбец B будем использовать для поиска чисел, которые делятся на 3. Для этого в ячейку B1 введите формулу с рисунка:
- Двойным щелчком по маркеру заполнения скопируйте формулу на весь столбец:
- Столбец С будем использовать для поиска чисел, которые НЕ делятся на 7. Для этого в ячейку С1 введите формулу с рисунка:
- Заполните весь столбец двойным щелчком по маркеру заполнения.
- Cтолбцы D, E, F таким же образом будем использовать для поиска чисел столбца А, которые не делятся на 17, 19 и 27
- Для поиска всех истинных значений используем столбец G. В ячейку G1 введите функцию
ЕСЛИ
: если все значения ячеек в столбцах B-F в этой строке истинны, выводим число из А1, иначе – пустую строку: - Ячейку H1 будем использовать для подсчета таких чисел, которые удовлетворяют всем условиям, т.е. для подсчета непустых ячеек столбца G:
- Ячейку H2 будем использовать для подсчета такого наибольшего числа:
Паскаль:
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)) |
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:
Заполните весь столбце, используя маркер автозаполнения.
Видеоразбор 17 задания ЕГЭ:
📹 YouTube здесь
Видеорешение на RuTube здесь
Работа с цифрами числа в n-й системе счисления
Рассматривается множество целых чисел, принадлежащих числовому отрезку [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:
ЕСЛИ
: если все значения ячеек в столбцах B, C в этой строке истинны, выводим число из А1, иначе – пустую строку:D
визуально и найдите первое значение):
Рассматривается множество целых чисел, принадлежащих числовому отрезку [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) |
Рассматривается множество целых чисел, принадлежащих числовому отрезку [2495; 7083], которые удовлетворяют следующим условиям:
Найдите количество таких чисел и минимальное из них.
Ответ: 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]) |
Рассматривается множество целых чисел, принадлежащих числовому отрезку [8800; 55535], которые удовлетворяют следующим условиям:
Найдите наибольшее из таких чисел и их количество.
Ответ: 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 делителей
Рассматривается множество целых чисел, принадлежащих числовому отрезку [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-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-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) |
В задании 17_2: 17 опечатка
Программа с++ строка 9
if (min == 8433) min = n;
надо
if (n<min) min = n;
Вот код к последней задаче на привычном паскале, если кому надо.
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.
Сайт немного обрезал программу. Вот основное тело.
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.