|
Пояснение.
Если A[i] элемент массива меньше A[0], то программа меняет их местами и увеличивает значение переменной c на 1. Программа выполнится дважды, первый раз поменяв местами A[0] и A[2], так как 3<4, и второй раз поменяв A[0] и A[5] (0<3). Таким образом значение переменной с станет равно 2.
Ответ: 2.
20. Задание Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает число M. Известно, что x > 100. Укажите наименьшее такое (т.е. большее 100) число x, при вводе которого алгоритм печатает 26.
Бейсик
| Python
| 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
| x = int(input())
L = x
M = 65
if L % 2 == 0:
M = 52
while L != M:
if L > M:
L = L - M
else:
M = M - L
print(M)
| Алгоритмический язык
| Паскаль
| алг
нач
цел 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
кон
| 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.
| Си
| #include
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.
21. Задание Напишите в ответе наименьшее значение входной переменной k, при котором программа выдаёт тот же ответ, что и при входном значении k = 10. Для Вашего удобства программа приведена на пяти языках программирования.
Бейсик
| Python
| DIM K, I AS LONG
INPUT K
I = 1
WHILE F(I) < G(K)
I = I + 1
WEND
PRINT I
FUNCTION F(N)
F = N * N * N
END FUNCTION
FUNCTION G(N)
G = 2*N + 3
END FUNCTION
| def f(n):
return n*n*n
def g(n):
return 2*n+3
k = int(input())
i = 1
while f(i) < g(k):
i+=1
print (i)
| Алгоритмический язык
| Паскаль
| алг
нач
цел i, k
ввод k
i := 1
нц пока f(i) < g(k)
i := i + 1
кц
вывод i
кон
алг цел f(цел n)
нач
знач := n * n * n
кон
алг цел g(цел n)
нач
знач := 2*n + 3
кон
| var
k, i : longint;
function f(n: longint): longint;
begin
f := n * n * n;
end;
function g(n: longint): longint;
begin
g := 2*n + 3;
end;
begin
readln(k);
i := 1;
while f(i) < g(k) do
i := i+1;
writeln(i)
end.
| Си
| #include
long f(long n) {
return n * n * n;
}
long g(long n) {
return 2*n + 3;
}
int main()
{
long k, i;
scanf("%ld", &k);
i = 1;
while(f(i) i++; printf("%ld", i);
return 0;
}
|
Пояснение.
Данная программа сравнивает и и прибавляет к i единицу до тех пор, пока . И выводит первое значение переменной i при котором
При k = 10, программа выведет число 3.
Запишем неравенство: отсюда получим, что наименьшее значение k = 3.
Ответ: 3.
22. Задание Исполнитель Май15 преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя Май15 – это последовательность команд. Сколько существует программ, для которых при исходном числе 2 результатом является число 29 и при этом траектория вычислений содержит число 14 и не содержит числа 25?
Траектория вычислений программы – это последовательность результатов
выполнения всех команд программы. Например, для программы 121 при исходном числе 7 траектория будет состоять из чисел 8, 16, 17.
Пояснение.
Для сложения справедлив переместительный (коммутативный) закон, значит, порядок команд в программе не имеет значения для результата.
Все команды увеличивают исходное число, поэтому количество команд не может превосходить (30 − 21) = 9. При этом минимальное количество команд — 3.
Таким образом, команд может быть 3, 4, 5, 6, 7, 8 или 9. Поэтому порядок команд не имеет значения, каждому числу команд соответствует один набор команд, которые можно расположить в любом порядке.
Рассмотрим все возможные наборы и вычислим количество вариантов рассположения команд в них. Набор 133 имеет 3 возможных вариантов расположения. Набор 1223 — 12 возможных вариантов расположения: это число перестановок с повторениями (1+2+1)!/(1! · 2! · 1!)). Набор 12222 — 5 вариантов. Набор 111222 — 20 возможных вариантов. Набор 11123 — 20 вариантов. Набор 111113 — 6 вариантов, набор 1111122 — 21 вариант, набор 11111112 — 8 вариантов, набор 111111111 — один вариант.
Всего имеем 3 + 12 + 5 + 20 + 20 + 6 + 21 + 8 + 1 = 96 программ.
Ответ: 96.
Ответ: 96.
Ответ: 13
23. Задание Сколько существует различных наборов значений логических переменныхx1, x2, ... x9, y1, y2, ... y9, которые удовлетворяют всем перечисленным ниже условиям?
(¬ (x1 ≡ y1)) ≡ (x2 ≡ y2)
(¬ (x2 ≡ y2)) ≡ (x3 ≡ y3)
…
(¬ (x8 ≡ y8)) ≡ (x9 ≡ y9)
В ответе не нужно перечислять все различные наборы значений переменных x1, x2, ... x9, y1, y2, ... y9, при которых выполнена данная система равенств. В качестве ответа Вам нужно указать количество таких наборов.
Пояснение.
Из последнего уравнения находим, что возможны три варианта значений x8 и y8: 01, 00, 11. Построим древо вариантов для первой и второй пар значений.
Таким образом, имеем 16 наборов переменных.
Дерево вариантов для пары значений 11:
Получаем 45 вариантов. Таким образом, система будет иметь 45 + 16 = 61 различных наборов решений.
Ответ: 61.
Ответ: 1024
24. Задание На обработку поступает положительное целое число, не превышающее 109. Нужно написать программу, которая выводит на экран сумму цифр этого числа, меньших 7. Если в числе нет цифр, меньших 7, требуется на экран вывести 0. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведена на пяти языках программирования.
Бейсик
| Python
| DIM N, DIGIT, SUM AS LONG
INPUT N
SUM = 0
WHILE N > 0
DIGIT = N MOD 10
IF DIGIT < 7 THEN
SUM = SUM + 1
END IF
N = N \ 10
WEND
PRINT DIGIT
| N = int(input())
sum = 0
while N > 0:
digit = N % 10
if digit < 7:
sum = sum + 1
N = N // 10
print(digit)
| Алгоритмический язык
| Паскаль
| алг
нач
цел N, digit, sum
ввод N
sum := 0
нц пока N > 0
digit := mod(N,10)
если digit < 7 то
sum := sum + 1
все
N := div(N,10)
кц
вывод digit
кон
| var N, digit, sum: longint;
begin
readln(N);
sum := 0;
while N > 0 do
begin
digit := N mod 10;
if digit < 7 then
sum := sum + 1;
N := N div 10;
end;
writeln(digit)
end.
| Си
| #include
int main()
{
int N, digit, sum;
scanf("%d", &N);
sum = 0;
while (N > 0)
{
digit = N % 10;
if (digit < 7)
sum = sum + 1;
N = N / 10;
}
printf("%d",digit);
return0;
}
|
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 456.
2. Приведите пример такого трёхзначного числа, при вводе которого программа выдаёт верный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.
Достаточно указать ошибки и способ их исправления для одного языка программирования. Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Пояснение.
Решение использует запись программы на Паскале. Допускается использование программы на любом из четырёх других языков.
1. Программа выведет число 4.
2. Пример числа, при вводе которого программа выдаёт верный ответ: 835.
Замечание для проверяющего. Программа работает неправильно из-за неверной выводимой на экран переменной и неверного увеличения суммы. Соответственно, программа будет работать верно, если в числе старшая цифра (крайняя левая) равна сумме цифр, меньших 7.
3. В программе есть две ошибки.
Первая ошибка. Неверное увеличение суммы.
Строка с ошибкой:
sum := sum + 1;
Верное исправление:
sum := sum + digit;
Вторая ошибка. Неверный вывод ответа на экран.
Строка с ошибкой:
writeln(digit)
Верное исправление:
writeln(sum)
25. Задание Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от –10 000 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых хотя бы одно число делится на 3. В данной задаче под парой подразумевается два подряд идущих элемента массива. Например, для массива из пяти элементов: 6; 2; 9; –3; 6 – ответ: 4.
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик
| Python
| CONST N AS INTEGER = 20
DIM A (1 TO N) AS INTEGER
DIM I AS INTEGER,
J AS INTEGER,
K AS INTEGER
FOR I = 1 TO N
INPUT A(I)
NEXT I
...
END
| # допускается также
# использовать две
# целочисленные переменные j и k
a = []
n = 20
for i in range(0, n):
a.append(int(input()))
...
| Алгоритмический язык
| Паскаль
| алг
нач
цел N = 20
целтаб a[1:N]
цел i, j, k
нц для i от 1 до N
ввод a[i]
кц
...
кон
| const
N = 20;
var
a: array [1..N] of integer;
i, j, k: integer;
begin
for i := 1 to N do
readln(a[i]);
...
end.
| Си
| Естественный язык
| #include
#define N 20
int main() {
int a[N];
int i, j, k;
for (i = 0; i < N; i++)
scanf("%d", &a[i]);
...
return 0;
}
| Объявляем массив A из 20 элементов.
Объявляем целочисленные переменные I, J, K.
В цикле от 1 до 20 вводим элементы массива A с 1-го по 20-й.
…
|
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.6) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Пояснение.
Бейсик
| K = 0
FOR I = 1 TO N-1
IF (A(I) MOD 3 = 0) OR (A(I + 1) MOD 3 = 0) THEN
K = K+1
END IF
NEXT I
PRINT K
| Python
| k = 0
for i in range(0, n – 1):
if (a[i] % 3 == 0 or a[i + 1] % 3 == 0):
k += 1
print(k)
| Алгоритмический язык
| k := 0;
нц для i от 1 до N-1
если mod(a[i],3)=0 или mod(a[i+1],3)=0
то
k := k+1
все
кц
вывод k
| Паскаль
| k := 0;
for i := 1 to N-1 do
if (a[i] mod 3=0) or (a[i+1] mod 3=0) then
inc(k);
writeln(k);
| Си
| k = 0;
for (i = 0; i
if (a[i]%3 == 0 || a[i+1]%3 == 0)
k++;
printf("%d", k);
| Естественный язык
| Записываем в переменную K начальное значение, равное 0. В цикле от первого элемента до предпоследнего находим остаток от деления текущего и следующего элемента массива на 3. Если первый или второй из полученных остатков равен 0, увеличиваем переменную K на единицу. После завершения цикла выводим значение переменной K
| 26. Задание Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 7 камней; такую позицию в игре будем обозначать (10, 7). Тогда за один ход можно получить любую из четырёх позиций: (11, 7), (20, 7), (10, 8), (10, 14). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.
Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 73. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, что в кучах всего будет 73 камня или больше.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока – значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. Например, при начальных позициях (6, 34), (7, 33), (9, 32) выигрышная стратегия есть у Пети. Чтобы выиграть, ему достаточно удвоить количество камней во второй куче.
|
|
|