ЕГЭ_Обработка целых чисел.pptx
- Количество слайдов: 34
Обработка целых чисел Задачи из заданий ЕГЭ, в которых используются программы обработки целых чисел: В 1, B 2, B 5, В 6, В 8, С 1, C 2, C 4 Авторы : Тагиров Р. Р. , Хадиев Р. М.
Типы задач • Дан фрагмент или программа. Определить значения некоторых переменных, которые в них вычисляются. • Дан фрагмент или программа для решения конкретной задачи. Найти ошибки и исправить. • По заданному условию написать свой фрагмент или программу для решения задачи.
• Работа с целыми числами имеет много особенностей. Например, арифметические операции для них выполняются точно, а также быстрее, чем для вещественных чисел. И ещё для них существуют свои операции целого деления, которые не применимы к вещественным числам. Паскаль Си типы Integer, longint Int, long int Остаток от деления MOD 147 mod 6 = 3 % 147 % 6 == 3 Частное от деления DIV 147 div 6 = 24 / 147 / 6 == 24
• Пример 1. • Дано два натуральных числа. Написать фрагмент программы, который напечатает слово ДА, если первое число делится на второе нацело, иначе напечатает слово НЕТ.
Решение • • • Паскаль READ (n, m); IF n MOD m = 0 THEN WRITE (‘ДА’) ELSE WRITE (‘HET’) • • • Си++/C cin >> m; if ( n % m == 0 ) cout << “ДА”; // printf (“ДА”); else cout << “HET”; // printf (“HET”);
• Пример 2. Дано натуральное число. Написать фрагмент программы для печати всех его делителей.
В решении будем перебирать все числа от 1 до заданного числа и проверять делимость на них. Очевидно, что достаточно проверять делители до самого заданного числа. • • • Паскаль READ (n); FOR k: =1 TO n DO IF n MOD k = 0 THEN WRITELN (k) • • • C++ cin >> n; for ( i=1; i <= n; i++ ) if ( n % i == 0 ) cout << i << endl; • // printf (“%dn”, i); // для программистов на Си
Задача 3. Определите значение переменной «c» после выполнения следующего фрагмента программы. Ответ запишите в виде целого числа. Паскаль a : = 25; b : = 12; a : = 3 * b - a; if a > b then c : = 2 * a - b else c : = 2 * a + b; C++ a = 25; b = 12; a = 3 * b - a; if (a > b) c = 2 * a - b; else c = 2 * a + b;
Решение 1. Заведём на листочке для каждой переменной аналоги ячеек памяти компьютера. Например, это можно оформить в виде таблицы. По мере присваивания переменным новых значений изменять их в таблице (зачёркивать старые и писать новые). 2. a = 25 b = 12 c = 3. a = 11 b = 12 c = 4. c = 34 Ответ: 34
Задача 4. Запишите число, которое будет напечатано в результате выполнения программы Pascal ( 1) var n, s: integer; ( 2) begin ( 3) n : = 0; ( 4) s : = 0; ( 5) while s <= 325 do ( 6) begin ( 7) s : = s + 10; ( 8) n : = n + 3 ( 9) end; (10) write(n) (11) end. С ( 1) #include<stdio. h> ( 2) void main() ( 3) { ( 4) int n, s; ( 5) n = 0; ( 6) s = 0; ( 7) while (s <= 325) ( 8) { ( 9) s = s + 10; (10) n = n + 3; (11) } (12) printf("%d", n); (13)}
Решение • • • 1. Основное – правильно вычислить количество повторений цикла n=0 s=0 перед первым повторением n=3 s=10 перед вторым повторением n=6 s=20 перед третьим повторением … n=3*K-3 s=10*K-10 перед K-м повторением … n=99 s=320 перед последним повторением Последнее повторение имеет номер 33 n=102 s=330 последнего повторения Следующего повторения не будет Ответ: 102
Задача 5. (С 1) Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится количество цифр этого числа. Программист торопился и написал программу неправильно. Си Паскаль Последовательно выполните следующее # include <stdio. h> void main() { long int N; int sum; scanf("%ld", &N); sum = 1; while (N > 1) { N = N /10; sum = sum + 1; } printf ("%d", sum); } Var N: longint; sum: integer; Begin readln(N); sum : = 1; while N > 1 do begin N : = N div 10; sum : = sum + 1; end; writeln(sum); end. 1. Напишите, что выведет эта программа при вводе числа 938? 2. Укажите одно число, для которого программа будет работать правильно. 3. Найдите, все ошибки в этой программе. Укажите все строки, содержащие ошибки, и для каждой такой строки приведите правильный вариант.
Решение подзадачи 1 Заведём на листочке для каждой переменной аналоги ячеек памяти компьютера. Например, это можно оформить в виде таблицы. По мере присваивания переменным новых значений изменять их в таблице (зачёркивать старые и писать новые). Перед первым выполнением цикла: N = 938 sum = 1 После первого повторения: N = 93 sum = 2 После второго повторения: N = 9 sum = 3 После третьего повторения: N = 0 sum = 4 Повторения закончились Ответ: 4
Решение подзадачи 2 В цикле у числа N по одному убираются последние цифры. Цикл завершает свою работу, когда число превратится в 1 или 0. Для всех чисел, у которых последняя (старшая) цифра больше единицы, выполняется лишнее повторение. Для правильного ответа подходит любое число со старшей цифрой 1. Например, 1 или 152. Ответ: 1
Решение подзадачи 3 Для исправления программы изменим условие повторения цикла: если от числа осталась одна старшая цифра, то цикл больше не повторяется! Вместо оператора while N > 1 do Запишем оператор while N > 9 do или while N >= 10 do Другой вариант исправления – считать цифры только тогда, когда они удаляются из числа Вместо оператора Запишем оператор (1) sum : = 1; sum : = 0; (2) while N > 1 do while N > 0 do
Задача 6 (С 2). Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 0 до 100 – баллы учащихся выпускного класса за итоговый тест по информатике. Для получения положительной оценки за тест требовалось набрать не менее 20 баллов. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит минимальный балл среди учащихся, получивших за тест положительную оценку Паскаль Си const N=30; var a: array [1. . N] of integer; i, j, min: integer; begin for i: =1 to N do readln (a[i]); … end. # include <stdio. h> # define N 30 void main(void) { int a[N]; int i, j, min; for (i=0; i<N; i++) scanf("% d", &a[i]); … }
Дополнительные требования • • Исходные данные объявлены так, как показано в тексте программы. Запрещается использовать переменные, не описанные в ней, но разрешается не использовать часть из них. В качестве ответа необходимо привести фрагмент программы, который должен находиться на месте многоточия. • • Варианты задачи 1. Гарантируется, что в классе хотя бы один учащийся получил за тест положительную оценку. • 2 Если в классе нет ни одного ученика, получившего положительную оценку, программа должна напечатать фразу «не найдено» .
Решение • • { вариант-1 } min : = 100; for i: =1 to n do if (a [i] < min) AND (a [i] >= 20) then min : = a [i]; write (min) • • • min = 100; for ( i=0; i < N; i++ ) if ( a [i] < min && a [i] >= 20 ) min = a [i]; print (“%d”, min); // cout << min;
Решение варианта-2 Паскаль Си min : = 101; for i: =1 to n do if ( a [i] < min ) AND ( a [i] >= 20 ) then min : = a [i]; min = 101; for ( i=0; i < N; i++ ) if ( a [i] < min && a [i] >= 20 ) min = a [i]; if min < 101 then write (min) else write (“не найдено”) if ( min < 101 ) printf (“%d”, min); else printf (“не найдено”);
Характерные ошибки, за которые снижаются баллы в этой задаче • • 1. Не присвоено начальное значение переменной для ответа (min) или присвоено не правильное значение, например, 0 или a [1]. 2. Не правильно организован цикл, например, от 2 -го элемента. Или цикл отсутствует вовсе. 3. Проверяется условие a [i] > 20 вместо a [i] >= 20 Или a [i] > min при поиске минимума 4. Не печатается найденный результат 5. Используются переменные, не описанные в условии задачи. 6. Используются непарные скобки begin-end или {}
Отдельные синтаксические ошибки, не искажающие замысла автора! • ВАРИАНТ – 1 • • • min : = 101 for i: =1 to n do if (a [i] < min ) AND (a [i] >= 20) then min : = a [i]; • ВАРИАНТ - 2 • • • min : = 101; for i: =1 to n do; if (a [i] < min ) AND (a [i] >= 20) then min : = a [i];
Задача 7 Укажите наименьшее из таких чисел х, при вводе которых программа напечатает 13 и 5. Паскаль Си++ ( 1) Var ( 2) x, a, b, c: integer; ( 3)begin ( 4) readln(x); ( 5) a : = 0; b : = 10; ( 6) while x > 0 do ( 7) begin ( 8) c : = x mod 10; ( 9) a : = a+c; (10) if c < b then b : = c; (11) x : = x div 10; (12) end; (13) writeln(a); write(b); (14)end. # include <iostream> using namespace std; void main() { int x, a=0, b=10, c; cin >> x; while ( x ) { c = x%10; a += c; if ( c < b ) b = c; x /= 10; } cout << a << endl << b; }
Решение • • • • 1. Проведём численный эксперимент с целью понять смысл переменных a и b, значения которых печатаются этой программой. 2. Возьмём для примера число x = 5734 и посмотрим, что вычислит и напечатает программа: x=5734 a=0 b=10 перед первым повторением цикла x=573 a=4 b=4 c=4 после первого повторения цикла x=57 a=7 b=3 c=3 после второго повторения цикла x=5 a=14 b=3 c=7 после третьего повторения цикла x=0 a=19 b=3 c=5 после четвёртого повторения цикла Повторения заканчиваются Программа напечатает 19 и 3 для нашего числа x = 5734. Какой смысл у переменных a, b, c? с – на каждом шаге хранит последнюю цифру числа (получается как остаток от деления на 10) b – на каждом шаге хранит наименьшую из встретившихся цифр а – копит сумму всех цифр X – на каждом шаге теряет одну цифру с конца
Выводы: 1. Надо найти все числа Х, у которых сумма цифр равна 13 и наименьшая цифра равна 5. 2. Количество цифр может быть только 2, т. к. одна цифра – 5, а остальные могут быть только не меньше. 3. Например, если бы было 3 цифры, то они должны быть равны 5, 5 и 3! Противоречие!!! 4. Допустимы только два числа 58 и 85, удовлетворяющие условиям. 5. Ответ: 58
Задача 8. Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(1) = 1 F(n) = F(n– 1) * n, при n >1 Чему равно значение функции F(5)? В ответе запишите только натуральное число
Решение • • • Последовательно будем вычислять значения функции, начиная с аргумента n=1 F (1) =1 n=2 F (2) =2*F (1) = 2 n=3 F (3) =3*F (2) = 6 n=4 F (4) =4*F (3) = 24 n=5 F (5) =5*F (4) = 120 • Здесь нет программы в явном виде на языке программирования, но есть алгоритм для последовательных вычислений • Ответ: 120
Задача 9. Функции F (n) и Q (n) задаются следующими соотношениями: F (n) = F (n-1) + 2*Q (n-1), n > 1 F (1) = 1 Q (n) = -2*F (n-1) + Q (n-1), n > 1 Q (1) = 1, где n – натуральное число. Чему равно значение F (5) + Q (5)?
Решение • • • Последовательно будем вычислять значения функций F и Q при n=1, 2, … n=1 F (1) = 1 Q (1) = 1 n=2 F (2) = 3 Q (2) = -1 n=3 F (3) = 1 Q (3) = -7 n=4 F (4) = -13 Q (4) = -9 n=5 F (5) = -31 Q (5) = 17 • Ответ: -14
Задача 10. Определите, что напечатает эта программа Паскаль Си a : = 2; b : = 19; c : = 1; while b > 0 do if b mod 2 = 0 then begin a : = a*2; b : = b div 2 end else begin c : = c*a; b : = b-1 end write (c) int a=2, b=19, c=1; while ( b ) if ( b % 2 == 0 ) a *= a, b /= 2; else c *= a, b--; cout << c << endl;
Решение • • • Заведём для 3 -х переменных ячейки на листочке и будем записывать их значения по мере изменения: a = 2 b = 19 c = 1 a = 2 b = 18 c = 2 a = 4 b = 9 c = 2 a = 4 b = 8 c = 8 a = 16 b = 4 c = 8 a = 256 b = 2 c = 8 a = 65536 b = 1 c = 8 a = 65536 b = 0 c = 524288 Ответ: 524288 (219)
Задача 11. • • • B 1. У исполнителя КВАДРАТОР две команды, которым присвоены номера: 1. возведи в квадрат, 2. прибавь 1. • • Первая из них возводит число на экране в квадрат, вторая увеличивает его на 1. Запишите порядок команд в программе, которая преобразует число 1 в число 10 и содержит не более 4 команд. • • Указывайте лишь номера команд. (Например, программа 2122 – это программа прибавь 1, возведи в квадрат, прибавь 1. Эта программа преобразует число 3 в число 18. )
Решение • • • Проще получить исходное число из результата, используя обратные команды: извлеки корень квадратный (1) и вычти 1 (2). Из числа 10 нельзя извлечь целый корень, поэтому применим вторую команду и получим 9. Из 9 извлечём корень и получим 3. Два раза применим вторую команду и получим число 1. Теперь выпишем в обратном порядке поученную программу • Ответ: 2122 • •
Задачи для самостоятельной работы • • 1 (B 6). Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(n) = 1 при n ≤ 2; F(n) = F(n − 1) + 2 × F(n − 2) при n > 2. Чему равно значение функции F(7)? В ответе запишите только натуральное число. • • • 2. Сколько натуральных чисел, не превосходящих 200, удовлетворяет условию «если чётное число делится на 5, то оно обязательно делится на 3 и на 7» ? •
Ответы • 1. 43 • 2. 180
ЕГЭ_Обработка целых чисел.pptx