Сдай ЕГЭ на 100 баллов!

Учебные материалы и курсы для подготовки
к ЕГЭ по математике и другим предметам

+7 (495) 984-09-27
+7 (800) 775-06-82
Ваш регион: Москва
Гангстер ЕГЭ

Задача №20. Работа с циклами и условными операторами.

Автор материалов — Лада Борисовна Есакова.

В этой задаче используется описание алгоритмов на языках программирования.

Основными используемыми конструкциями являются конструкции ветвления и циклов.

Конструкция ветвления в языке Паскаль

Полная

Неполная

if <логическое  выражение> then

<оператор1>
else <оператор2>;

 

if <логическое выражение> then

<оператор1>;

При этом оператор может быть простым, а может быть составным.

Составной оператор имеет структуру:

begin

<Последовательность_операторов>

end

Конструкция циклов в языке Паскаль

Цикл со счетчиком (или цикл for)

Этот цикл используется, когда число повторений не связано с тем, что происходит в теле цикла. Т.е. количество повторений может быть вычислено заранее.

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

Цикл for существует в двух формах:

for <счетчик>:=<значение> to <конечное_значение> do

<тело_цикла>;

for <счетчик>:=<значение> downto <конечное_значение> do

<тело_цикла>;

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

Цикл с предусловием (или цикл while)

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.

while <логическое_выражение> do

<тело_цикла>;

Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет зацикливание.

Цикл с постусловием (или цикл repeat)

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако, бывают ситуации, когда тело цикла должно выполниться хотя бы один раз, независимо от того, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. В случае true происходит выход из цикла, в случае false – его повторение:

repeat <тело_цикла>

until <логическое_выражение>;

Тело цикла может включать в себя другой цикл. Количество вложенных циклов не ограничено.

Операции div и mod

Операция div возвращает целочисленный результат деления. При этом дробная часть будет отброшена. X div Y вернет целую часть от деления X на Y.

Например, после работы оператора z := 55 div 6, z будет равно 9.

Операция mod возвращает остаток от деления деления. X mod Y вернет остаток от деления X на Y.

Например, после работы оператора z := 55 mod 6, z будет равно 1.

 

Поиск наименьшего числа

Пример 1.

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

Бей­сик

Python

DIM X, Y, A, B AS INTEGER

A = 0

B = 10

INPUT X

WHILE X > 0

Y = X MOD 10

X = X \ 10

IF Y > A THEN A = Y

IF Y < B THEN B = Y

WEND

PRINT A

PRINT B

a = 0

b = 10

x = int(input())

while x > 0:

y = x % 10

x = x // 10

if y > a:

a = y

if y < b:

b = y

print(a)

print(b)

Пас­каль

Ал­го­рит­ми­че­ский язык

var x, y, a, b: integer;

begin

a := 0;

b := 10;

readln(x);

while x > 0 do

begin

y := x mod 10;

x := x div 10

if y > a then

a := y;

if y < b then

b := y;

end;

writeln(a);

writeln(b)

end.

алг

нач

цел x, y, a, b

a := 0

b := 10

ввод x

нц пока x > 0

y := mod(x, 10)

x := div(x, 10)

если y > a

то a := y

все

если y < b

то b := y

все

кц

вывод a, нс, b

кон

Си

#include <stdio.h>

int main()

{

int x, y, a, b;

a = 0;

b = 10;

scanf(«%d», &x);

while (x > 0)

{

y = x % 10;

x = x / 10;

if (y > a)

a = y;

if (y < b)

b = y;

}

printf(«%d\n%d\n», a, b);

}

Решение:

Т. к. опе­ра­тор div воз­вра­ща­ет целую часть от де­ле­ния, то при де­ле­нии на 10 это рав­но­силь­но от­се­че­нию по­след­ней цифры. Значит, цикл вы­пол­нить­ся пять раз.

В пе­ре­мен­ную a за­пи­сы­ва­ет­ся оста­ток от де­ле­ния числа x на 10 при усло­вии, что этот оста­ток боль­ше числа уже за­пи­сан­но­го в пе­ре­мен­ной a. В пе­ре­мен­ную b за­пи­сы­ва­ет­ся оста­ток от де­ле­ния числа x на 10 при усло­вии, что этот оста­ток мень­ше числа уже за­пи­сан­но­го в пе­ре­мен­ной b. Таким об­ра­зом, в пе­ре­мен­ную a за­пи­сы­ва­ет­ся наи­боль­шая цифра числа x, а в пе­ре­мен­ную b — наи­мень­шая. Итак, нужно найти наименьшее пятизначное число, у которого наименьшая цифра равна 3, а наибольшая  — равна 6. Такое число:33336.

Ответ: 33336

 

Пример 2.

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

Решение:

В теле цикла числа M и L умень­ша­ют­ся, пока не ста­нут рав­ны­ми. Поскольку в итоге напечатано 26, значит, в конце программы оба числа равны 26. Рассмотрим изменение этой пары чисел в обратном порядке (при этом не знаем, какое именно число M, а какое L):

(26; 26) – (52; 26) – (78; 52) – (130; 52)

Если 130 – это L в начале работы (равное x), то т.к. оно четное, M в начале работы должно быть 52. Условие выполнено для пары (130; 52), значит искомое число 130.

Ответ: 130

 

Поиск наибольшего числа

Пример 3.

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

var x, L, M: integer;

begin

    readln(x);

    L:=0; M:=0;

    while x > 0 do begin

        L:= L + 1;

        if x mod 2 = 0 then

            M:= M + (x mod 10) div 2;

        x:= x div 10;

    end;

    writeln(L); write(M);

end.

 

Решение:

На каж­дом шаге от де­ся­тич­ной за­пи­си x от­се­ка­ет­ся по­след­няя цифра до тех пор, пока все цифры не будут от­се­че­ны, то есть x не ста­нет равно 0. В переменной L накапливается число выполнений цикла. L=3, значит цикл выполнился 3 раза, значит исходное число x трехзначное.

 

Те­перь рас­смот­рим опе­ра­тор из­ме­не­ния M:

if x mod 2 = 0 then

M:= M + (x mod 10) div 2;

end;

M увеличивается только в случае, если текущее значение  x четное, т.е. если четная его последняя цифра. В этом случае к текущему значению M прибавляется целочисленный результат деления последней цифры текущего значения x на 2.

Таким образом, М – это сумма половин четных цифр числа x.

Значит, нам нужно найти наибольшее трехзначное число х, сумма четных цифр которого равна 14.

Наибольшее такое число 986.

Ответ: 986

 

Пример 4.

Ниже на пяти язы­ках за­пи­сан ал­го­ритм. По­лу­чив на вход число x, этот ал­го­ритм пе­ча­та­ет два числа a и b. Ука­жи­те наи­боль­шее из таких чисел x, при вводе ко­то­ро­го ал­го­ритм пе­ча­та­ет сна­ча­ла 2, а потом 5.

 Бей­сик

Python

DIM X, A, B AS INTEGER

INPUT X

A = 0: B = 1

WHILE X > 0

A = A+1

B = B * (X MOD 100)

X = X\100

WEND

PRINT A

PRINT B

x = int(input())

a, b = 0, 1

while x > 0:

a = a + 1

b = b * x%100

x = x//100

print(a)

print(b)

Пас­каль

Ал­го­рит­ми­че­ский язык

var x, a, b: integer;

begin

readln(x);

a := 0; b := 1;

while x > 0 do

begin

a := a+1;

b := b*(x mod 100);

x := x div 100;

end;

writeln(a); write(b);

end.

алг

нач

цел x, a, b

ввод x

a:=0; b:=1

нц пока x > 0

a := a+1

b := b*mod(x,100)

x := div(x,100)

кц

вывод a, нс, b

кон

Си

#include <stdio.h>

void main()

{

int x, a, b;

scanf(«%d», &x);

a = 0; b = 1;

while (x > 0) {

a = a+1;

b = b * (x%100);

x = x/100;

}

printf(«%d\n%d», a, b);

}

 

Решение:

Т. к. опе­ра­тор div воз­вра­ща­ет целую часть от де­ле­ния, то при де­ле­нии на 100 это рав­но­силь­но от­се­че­нию по­след­них двух цифр.

На каж­дом шаге от де­ся­тич­ной за­пи­си x от­се­ка­ет­ся две по­след­них цифры до тех пор, пока все цифры не будут от­се­че­ны, то есть x не ста­нет равно 0.

В переменной a накапливается количество выполнений цикла, a=2, значит число x трехзначное или четырехзначное.

В переменной b накапливается произведение двух чисел: числа, состоящего из последних двух цифр числа х и первой цифры числа х, если число x трехзначное (или двух первых цифр, если число x четырехзначное).

Т.к. b=5, то второй из множителей не может быть двузначным, т.е. число x трехзначное. Наибольшее такое число равно 501.

Ответ: 501

 

Звоните нам: +7 (800) 775-06-82 (бесплатный звонок по России)

Или нажмите на кнопку «Узнать больше», чтобы заполнить контактную форму. Мы обязательно Вам перезвоним.

Узнать больше

Полезные материалы для ЕГЭ в нашей рассылке. Обучающее видео бесплатно!

Ссылка на обучающее видео придет Вам по e-mail.