20. Анализ программы с циклами и условными операторами

Единый государственный экзамен ЕГЭ Информатика задание №20 Демонстрационный вариант 2018 Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наименьшее число x, при вводе которого алгоритм печатает сначала 5, а потом 7.

Бейсик
Visual Basic
12345678910111213 DIM X, L, M AS INTEGERINPUT XL = 0M = 0WHILE X > 0 M = M + 1 IF X MOD 2 <> 0 THEN L = L + 1END IFX = X \ 2WENDPRINT LPRINT M
Python
Python
12345678910 x = int(input())L = 0M = 0while x > 0: M = M + 1 if x % 2 != 0: L = L + 1 x = x // 2print(L)print(M)
Алгоритмический язык
12345678910111213141516 алгначцел x, L, Mввод xL := 0M := 0нц пока x > 0 M := M + 1 если mod(x,2) <> 0 то L := L + 1 все x := div(x,2)кцвывод L, нс, Mкон
Паскаль
Delphi/Pascal
123456789101112131415 var x, L, M: integer;beginreadln(x);L := 0;M := 0;while x>0 dobegin M := M + 1; if x mod 2 <> 0 then L := L + 1; x := x div 2;end;writeln(L);writeln(M);end.
С++
C
1234567891011121314151617 #include <iostream>using namespace std;int main(){int x, L, M;cin >> x;L = 0;M = 0;while (x > 0) { M = M + 1; if(x % 2 != 0) { L = L + 1; } x = x / 2;}cout << L << endl << M << endl;return 0;}

Решение:

L(Сумма нечетных цифр)=5

M(Сумма цифр)=7

1 – 2 – 4 – 9 – 19 – 39 – 79

Ответ: 79


Демонстрационный вариант Единый государственный экзамен ЕГЭ 2017 г. – задание №20. Ниже на пяти языках программирования записан алгоритм. Получив на вход натуральное число x, этот алгоритм печатает число R. Укажите такое число x, при вводе которого алгоритм печатает двузначное число, сумма цифр которого равна 16. Если таких чисел x несколько, укажите наименьшее из них.

Бейсик

Visual Basic
123456789 DIM X,D,R AS LONGINPUT XR = 0WHILE X>0 D = X MOD 10 R = 10*R + D X = X \ 10WENDPRINT R

Python

Python
1234567 x = int(input())R = 0while x>0: d = x % 10 R = 10*R + d x = x // 10print(R)

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

123456789101112 алгнач цел x, d, R ввод x R := 0 нц пока x>0 d := mod(x, 10) R := 10*R + d x := div(x, 10) кц вывод Rкон

Паскаль

Delphi/Pascal
12345678910111213 var x,d,R: longint;begin readln(x); R := 0; while x>0 do begin d := x mod 10; R := 10*R + d; x := x div 10 end; writeln(R)end.

Си

C
123456789101112131415 #include <stdio.h>int main(){ long x,d,R; scanf("%ld", &x); R = 0; while (x>0) { d = x % 10; R = 10*R + d; x = x / 10; } printf("%ld", R);return 0;}

Решение:

16 = 9 + 7

16 = 8 + 8

16 = 7 + 9

79

Ответ: 79


Демонстрационный вариант Единый государственный экзамен ЕГЭ 2016 г. – задание №20. Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает число M. Известно, что x > 100. Укажите наименьшее такое (т.е. большее 100) число x, при вводе которого алгоритм печатает 26.

Бейсик

Visual Basic
123456789101112131415 DIM X, L, M AS INTEGER INPUT X L = X M = 65 IF L MOD 2 = 0 THEN    M = 52 ENDIF WHILE L <> M IF L > M THEN    L = L M ELSE    M = M L ENDIF WEND PRINT M

Python

Python
1234567891011 x = int(input())L = xM = 65if L % 2 == 0:    M = 52while L != M:    if L > M:        L = L - M    else:        M = M - Lprint(M)

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

1234567891011121314151617181920 алг нач    цел x, L, M    ввод x    L := x    M := 65    если mod(L,2)=0        то            M := 52    все    нц пока L <> M        если L > M            то                L := L M            иначе                M := M L        все    кц    вывод M кон

Паскаль

Delphi/Pascal
1234567891011121314 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.

Си

C
1234567891011121314151617 #include<stdio.h> void main() {    int x, L, M;    scanf("%d", &x);    L = x;    M = 65;    if (L % 2 == 0)        M = 52;    while (L != M){        if(L > M)            L = L - M;        else            M = M - L;    }    printf("%d", M); }

Решение:

В теле цикла числа M и L уменьшаются, пока не станут равными. Чтобы в итоге было напечатано 26, оба числа в какой-то момент должны быть равны 26. Пойдем от конца к началу: на предыдущем шаге одно число было 26, а другое 26 + 26 = 52. Еще на шаг раньше 52 + 26 = 78 и 52. До того 78 + 52 = 130 и 52. То есть наименьшее возможное число 130. А поскольку найденное число четное, то M будет присвое­но значение 52, что и приведет к необходимому результату.

Ответ: 130


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

Паскаль Си Python
var x, L, M: integer;

begin
readln(x);
L:=0; M:=0;
while x > 0 do begin
L:= L + 1;
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.

#include <stdio.h>

int main(void)
{
int L, M, x;
scanf(″%d″, &x);
L = 0; M = 0;
while (x > 0)
{
L = L + 1;
M = M + (x % 10);
x = x / 10;
}
printf(″%d\n%d″, L, M);
}

x = int(input())
L = 0; M = 0
while x > 0:
L = L + 1
M = M + (x % 10)
x = x // 10
print(“%d\n%d” % (L, M))

Решение:

L = L + 1; L – счетчик. Он показывает, сколько раз цикл повторяется.

M = M + (x % 10); При каждом повторении последняя цифра числа добавляется к M. M – это сумма цифр в числе.

x = x / 10; При каждом повторении наименьшая цифра удаляется.

L=3: Число имеет 3 цифры.

M=7: Сумма цифр равна 7.

Укажите наибольшее из таких чисел: _ _ _ = 7+0+0=7

Ответ: 700


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

Паскаль Си Python
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
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.
#include <stdio.h>
int main(void)
{
int L, M, x;
scanf(″%d″, &x);
L = 0; M = 0;
while (x > 0)
{
L = L + 1;
if (x % 2 == 1)
M = M + (x % 10);
x = x / 10;
}
printf(″%d\n%d″, L, M);
}
x = int(input())
L = 0; M = 0
while x > 0:
L = L + 1
if x % 2 == 1:
M = M + (x % 10)
x = x // 10
print(“%d\n%d” % (L, M))

Решение:

L = L + 1; L – счетчик. Он показывает, сколько раз цикл повторяется.

if (x % 2 == 1) M = M + (x % 10); В каждом повторении, если число нечетно, наименьшая цифра добавляется к M. M – это сумма нечетных цифр в числе.

x = x / 10; При каждом повторении наименьшая цифра удаляется.

L=3: Число имеет 3 цифры.

M=8: Сумма нечетных цифр равна 8.

Укажите наименьшее из таких чисел: _ _ _ = 1+0+7=8

Ответ: 107


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

Паскаль Си Python
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) * 2;
end;
x:= x div 10;
end;
writeln(L); write(M);
end.
 #include <stdio.h>
int main(void)
{
int L, M, x;
scanf(″%d″, &x);
L = 0; M = 0;
while (x > 0)
{
L = L+1;
if ((M < x) && (x % 2 == 1)
M = (x % 10) * 2;
x = x / 10;
}
printf(″%d\n%d″, L, M);
}
 x = int(input())
L = 0; M = 0
while x > 0:
L = L + 1
if (M < x) and (x % 2 == 1):
M = (x % 10) * 2
x = x // 10
print(“%d\n%d” % (L, M))

Решение:

L = L + 1; L – счетчик. Он показывает, сколько раз цикл повторяется.

if ((M < x) && (x % 2 == 1) M = (x % 10) * 2; В каждом повторении, если число нечетное и М меньше, чем x, наименьшая цифра умножается на 2 и присваивается M. M равен 10, поэтому нечетная цифра числа равна 5.

x = x / 10; При каждом повторении наименьшая цифра удаляется.

L=3: Число имеет 3 цифры.

M=10: Нечетная цифра числа равна 5. (5.2 = 10)

Укажите наименьшее из таких чисел: _ _ _ = 1+0+5 (5<1-В последнем повторении условие ложно.)

Ответ: 105


Ниже записан алгоритм. После выполнения алгоритма было напечатано 3 числа. Первые два напечатанных числа – это числа 13 и 65. Какое наибольшее число может быть напечатано третьим

Паскаль Си Python
 var x, y, z: integer;
r, a, b: integer;
begin
readln(x, у);
if у > x then begin
z:= x; x:= у; у:= z;
end;
a:= x; b:= y;
while b > 0 do begin
r:= a mod b;
a:= b;
b:= r;
end;
writeln(a);
writeln(x);
write(у);
end.
 #include <stdio.h>
int main(void)
{
int r, a, b, x, y, z;
scanf(″%d%d″, &x, &y);
if (у > x)
{
z = x; x = у; у = z;
}
a = x; b = y;
while (b > 0)
{
r = a % b;
a = b;
b = r;
}
printf(“%d\n%d\n%d”, a, x, y);
}
x = int(input())
y = int(input())
if (y > x):
z = x
x = y
y = z
a = x; b = y
while b > 0:
r = a % b
a = b
b = r
print(“%d\n%d\n%d” % (a, x, y))

Решение:

if (у > x){ z = x; x = у; у = z; } : Если y больше, чем x, они обмениваются со значениями. Это означает, что x всегда больше y. Значения x и y не изменяются в оставшейся части программы. Второе напечатано число и третье напечатано число являются х и у. x=65 и x>y.

Следующая часть программы находит НОД.
a = x; b = y;
while (b > 0)
{
r = a % b;
a = b;
b = r;
}

a=13.

Это означает, что НОД 65 и y должны быть 13, а у должен быть меньше, чем 65, но должно быть наибольшее число. Это 52.

Ответ: 52


Ниже записан алгоритм. Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 4, а потом 13.

Паскаль Си Python
 var x, a, b: integer;
begin
readln(x);
a := 0; b := 1;
while x > 0 do begin
a := a+2;
b := b*(x mod 1000);
x := x div 1000;
end;
writeln(a); write(b);
end.
 #include <stdio.h>
int main(void)
{
int x, a, b;
scanf(″%d″, &x);
a = 0; b = 1;
while (x > 0)
{
a = a+2;
b = b*(x % 1000);
x = x / 1000;
}
printf(″%d\n%d″, a, b);
}
 x = int(input())
a = 0; b = 1
while x > 0:
a = a + 2
b = b * (x % 1000)
x = x // 1000
print(“%d\n%d” % (a, b))

Решение:

a = a+2; a – Это счетчик, но половина «a» – это количество повторений.

Укажите наибольшее из таких чисел: В первом повторении его значение будет равно 1. Таким образом, последние 3 цифры – 001. Во втором повторении его значение будет 13. Таким образом, это 13.

Ответ: 13001


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

Паскаль Си Python
 var x, L, M: integer;
begin
readln(x);
L := x-16;
M := x+16;
while L <> M do
if L > M then
L := L – M
else
M := M – L;
writeln(M);
end.
 #include <stdio.h>
int main(void)
{
int x, L, M;
scanf(″%d″, &x);
L = x-16; M = x+16;
while (L != M)
{
if(L > M)
L = L – M;
else
M = M – L;
}
printf(″%d″, M);
}
 x = int(input())
L = x-16
M = x+16
while L != M:
if L > M:
L = L – M
else:
M = M – L
print(M)

Решение:

16 является НОД начальных значений L и M.

L = x-16; M = x+16;

x>100 и делится на 16. Давайте попробуем = 112

L = 112-16 = 96; M = 112+16 = 128

НОД(96, 128)=32 (не подходит)

Следующее число = 128

L = 128-16 = 112; M = 128+16 = 144

НОД(112, 144) = 16 (подходит)

Ответ: 16


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

Паскаль
Delphi/Pascal
12345678910111213 var x, L, M:integer;beginreadln(x);L:=0; M:=1;while x > 0 do begin L:=L+1; M:= M*(x mod 8); x:= x div 8;end;writeln(L);write(M);end.
Python
Python
123456789 x = int(input())L = 0M = 1while x > 0 : L = L+1 M = M*(x % 8) x = x // 8print(L)print(M)

 
С++
C++
123456789101112131415 #include <iostream>using namespace std;int main(){int L, M, x;cin >> x;L = 0; M = 1;while (x > 0) { L = L + 1; M = M*(x % 8); x = x / 8;}cout << L << endl << M ;return 0;}

Решение:

L=3

M = 120 = 4 * 5 * 6

6 * 8 = 48 + 5 = 53 * 8 = 424 + 4 = 428

 

Ответ: 428