Анализ программы, содержащей подпрограммы, циклы и ветвления
  главная : карта раздела : автора  
 


Тренажер на определение четности чисел в нечетных системах счисления и наоборот

При решении некоторых задач данного вопроса проверяется умение различать четные числа в нечетныхсистемах счисления и наоборот. Вот простой пример, попробуйте сказать четные или нечетные числа 5312, 521 и 52 в системе счисления по основанию семь.

Если вы подумали, что 5312 и 52 - четные, а 521 – нечетное, то это означает, что у вас большие проблемы и данный тренажер может вам помочь.

Как работать с тренажером?

Для проверки четности, к примеру, числа 5312 вводим в окно, расположенное против строки «Задайте основание системы счисления» число 7, т.е. основание системы счисления, а в окно, расположенное ниже вводим исследуемое - 5312.

Программа быстренько определяет его четность и для убедительности преобразует его в десятичную систему счисления для сравнения. Возникнут вопросы, пишите - постараемся совместно разобраться. Ну а решившие все четыре задачи, расположенные ниже и впишсавшие свои ответы в форму ниже будут увековечены для истории ...

№2921. Укажите наибольшее трехзначное число, при вводе которого алгоритм напечатает 2 и 6
var x, a, b: longint;
begin
readln(x);
a := 0; b := 1;
while x > 0 do begin
if x mod 2 > 0 then a := a + 1
else b := b + (x mod 7);
x := x div 7;
end;
writeln(a); write(b);
end.

№3553. Укажите наименьшее натуральное число, при вводе которого алгоритм напечатает 2 и 6
var x, a, b: longint;
begin
readln(x);
a := 0; b := 0;
while x > 0 do begin
if x mod 2 > 0 then a := a + 1
else b := b + (x mod 5);
x := x div 5;
end;
writeln(a); write(b);
end.

 

№4162. Укажите наименьшее натуральное число, при вводе которого алгоритм напечатает 2 и 6.
var x, a, b: longint;
begin
readln(x);
a := 0; b := 0;
while x > 0 do begin
if x mod 2 = 0 then a := a + 1
else b := b + (x mod 5);
x := x div 5;
end;
writeln(a); write(b);
end.

№5934. Укажите наибольшее трехзначное число, при вводе которого алгоритм напечатает 2 и 6.
var x, a, b: longint;
begin
readln(x);
a := 0; b := 0;
while x > 0 do begin
if x mod 2 = 0 then a := a + 1
else b := b + (x mod 5);
x := x div 5;
end;
writeln(a); write(b);
end.

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


Интерактивный тренажер 20 ЕГЭ ДЕМО 2017
"Анализ программы, содержащей подпрограммы, циклы и ветвления"

 


Разбор решения задания 20 демоверсии ЕГЭ 2016
Анализ программы, содержащей подпрограммы, циклы и ветвления
с последующей отработкой на интерактивном тренажере

Получив на вход число x, этот алгоритм печатает число M. Известно, что x > 100. Укажите наименьшее такое (т.е. большее 100) число x, при вводе которого 11алгоритм печатает 26.

var x, L, M: integer;
begin
readln(x);
L := x;
M := 65;
if L mod 2 = 0 then  M := 52;
while L <> M do 
if L > M then 
L := L – M
else 
M := M – L;
writeln(M);
end.

Практически почти вся задача сводится к нахождению в программе кода, так называемого алгоритма Евклида, блок - схема которого нарисована справа и позволяющего вычислить наибольший общий делитель для двух заданных чисел (НОД).

Подробнее познакомиться с методом трассировки и поэкспериментировать с алгоритмом Евклида можно на одноименном интерактивном тренажере  - демонстрации, расположенном по этой ссылке.

Ниже показан программный код этого алгоритма, где первая строка есть ничто иное, как команда цикла, который будет выполняться до тех пор, пока выполняется условие: L <> M

while L <> M do  
if L > M then  
L := L – M       
else    
M := M – L;    

А по завершении его выводится на печать значение переменной M, содержащей наибольший общий делитель

writeln(M);

Предположим, что M присвоено значение 65, но по условию алгоритм должен напечатать 26, получаем противоречие, поскольку НОД(x,65)=26, потому что 65 не делится на 26

Следовательно, введенное число x было четным, а командная строка:

  if L mod 2 = 0 then  M := 52;

заменила значение M с 65 на 52. Откуда делаем вывод, что нужно найти чётное число x, большее 100, такое, что НОД(x,52)=26

Первое число, большее 100, которое делится на 26 – это 104, но оно не подходит, потому что делится ещё и на 52, так что НОД(x,52)=52

Поэтому берём следующее число, которое делится на 26: 104 + 26 = 130

Итого правильный ответ: 130


Интерактивный тренажер по заданию 20 демоверсии ЕГЭ 2016 на
Анализ программы, содержащей подпрограммы, циклы и ветвления

Анимации, сопутствующие успешному пониманию данного вопроса:

Интерактивная демонстрация алгоритма Евклида

Интерактивная демонстрация с тренажером и тестовой программой


Интерактивный тренажер 20 ЕГЭ ДЕМО 2015
на "Анализ программы, содержащей подпрограммы, циклы и ветвления"

 

Примеры задач, генерируемых интерактивным тренажером 20 ЕГЭ ДЕМО 2015 на
"Анализ программ, содержащих подпрограммы, циклы и ветвления"
с решением и проверкой методом прокрутки

 

Задание №1.

Ниже записана программа. Получив на вход число x, эта программа печатает два числа. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 8.
var x, L, M: integer;
begin readln(x);
L:=0; M:=0;
while x > 0 do begin
L:=L+1;
if (M < x) and (x mod 2 = 0) then begin;
M:= (x mod 10);
end;
x:= x div 10;
end;
writeln(L); write(M);
end.

Решение:
Для решения задачи необходимо понять, что делает эта программа Видим, что переменная L с каждым шагом цикла увеличивается на 1 Переменная x на каждом шаге цикла делится на 10 и остаток отбрасывается L = 3, это означает, что цикл прокрутился 3 раза, следовательно, и остатков будет взято 3, но только в том случае, если М будет меньше х, и, х - четное, при этом новый остаток будет заменять старое значение на новое Нам нужно найти наименьшее число х, следовательно, первый остаток (с учетом системы счисления) должен быть равен 8 Догадайтесь самостоятельно, почему следующие два остатка могут быть только такими: 1 и 1

Правильный ответ = 118

 

Задание №2.

Ниже записана программа. Получив на вход число x, эта программа печатает два числа. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 8.

var x, L, M: integer;
begin
readln(x);
L:=0; M:=0;
while x > 0 do begin
L:=L+1;
if x mod 2 = 1 then begin
M:= M + (x mod 8);
end;
x:= x div 8;
end;
writeln(L); write(M);
end.

Решение:
Для решения задачи необходимо понять, что делает эта программа Видим, что переменная L с каждым шагом цикла увеличивается на 1 Переменная x на каждом шаге цикла делится на 8 и остаток отбрасывается L = 3, это означает, что цикл прокрутился 3 раза, следовательно, и остатков будет взято 3 Очевидно, что в М сохранится сумма остатков от нечетных значений х, в данном случае она = 8 Исходя из этого, формируем строку из остатков: 107 Нам остается полученную из остатков строку: 107 перевести в десятичную систему счисления 1*8^2 + 0*8^1 + 7*8^0 = 71

Правильный ответ = 71

Задание №3.

Ниже записана программа. Получив на вход число x, эта программа печатает два числа. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 9.

var x, L, M: integer;
begin
readln(x);
L:=0; M:=0;
while x > 0 do begin
L:=L+1;
if (M < x) and (x mod 2 = 1) then begin;
M:= (x mod 10);
end;
x:= x div 10;
end;
writeln(L); write(M);
end.

Решение:
Для решения задачи необходимо понять, что делает эта программа Видим, что переменная L с каждым шагом цикла увеличивается на 1 Переменная x на каждом шаге цикла делится на 10 и остаток отбрасывается L = 3, это означает, что цикл прокрутился 3 раза, следовательно, и остатков будет взято 3, но только в том случае, если М будет меньше х, и, х - нечетное, при этом новый остаток будет заменять старое значение на новое. Нам нужно найти наибольшее число х, следовательно, первый остаток (с учетом системы счисления) должен быть равен 8 Догадайтесь самостоятельно, почему следующие два остатка могут быть только такими: 9 и 9 Вот и все, задача решена!

Правильный ответ = 998

 
© Северобайкальск, Russia
Александр Козлов, 2019

  Рейтинг@Mail.ru