20. Анализ программы с циклами и условными операторами
Единый государственный экзамен ЕГЭ Информатика задание №20 Демонстрационный вариант 2018 Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наименьшее число x, при вводе которого алгоритм печатает сначала 5, а потом 7.
Бейсик Visual Basic
|
Python Python
|
||||
Алгоритмический язык
|
Паскаль Delphi/Pascal
|
||||
С++ C
|
Решение:
L(Сумма нечетных цифр)=5
M(Сумма цифр)=7
1 – 2 – 4 – 9 – 19 – 39 – 79
Ответ: 79
Демонстрационный вариант Единый государственный экзамен ЕГЭ 2017 г. – задание №20. Ниже на пяти языках программирования записан алгоритм. Получив на вход натуральное число x, этот алгоритм печатает число R. Укажите такое число x, при вводе которого алгоритм печатает двузначное число, сумма цифр которого равна 16. Если таких чисел x несколько, укажите наименьшее из них.
Бейсик
Visual Basic123456789 | DIM X,D,R AS LONGINPUT XR = 0WHILE X>0 D = X MOD 10 R = 10*R + D X = X \ 10WENDPRINT R |
Python
Python1234567 | 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/Pascal12345678910111213 | 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. |
Си
C123456789101112131415 | #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 Basic123456789101112131415 | 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
Python1234567891011 | 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/Pascal1234567891011121314 | 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. |
Си
C1234567891011121314151617 | #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 |
#include <stdio.h>
int main(void) |
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
|
Python Python
|
||||
С++ C++
|
Решение:
L=3
M = 120 = 4 * 5 * 6
6 * 8 = 48 + 5 = 53 * 8 = 424 + 4 = 428
Ответ: 428