Дан массив, содержащий 2016 неотрицательных целых чисел. Необходимо найти в этом массиве количество таких элементов, которые равны среднему арифметическому двух элементов, расположенных непосредственно перед ним. Например, в массиве из 6 элементов, равных соответственно 4, 6, 5, 1, 3, 2, есть три таких элемента, они расположены на третьем, пятом и шестом месте и равны 5, 3 и 2.
Напишите на одном из языков программирования программу для решения этой задачи. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из описанных переменных.
| Бейсик | Python |
|---|---|
CONST N=2016 DIM A(N) AS INTEGER DIM I, K AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I … END
| # допускается также использо- # вание целочисленной # переменной k a = [] N = 2016 for i in range(0, N): a.append(int(input())) …
|
| Паскаль | Алгоритмический язык |
const N=2016; var a: array [1..N] of integer; i, k: integer; begin for i:=1 to N do readln(a[i]); … end.
| алг нач цел N=2016 целтаб a[1:N] цел i, k нц для i от 1 до N ввод a[i] кц … кон |
| Си | |
#include <iostream> using namespace std; #define N 2016 int main(){ int a[N]; int i, k; for (i=0; i … return 0; } | |
В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.4). В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии.
Необходимо перебрать все элементы массива, кроме двух последних (так как после них нет двух элементов), выделить удовлетворяющие условию и подсчитать их. При этом для проверки нельзя просто вычислять среднее арифметическое как полусумму двух следующих элементов: если использовать целое деление, результат может получиться неверным из-за округления, а если использовать вещественное деление, то будет выполняться преобразование целого в вещественное и сравнение вещественных чисел на точное равенство, которое не гарантирует верный результат.
Поэтому нужно либо заменять деление умножением (не делить на 2 сумму следующих, а умножать проверяемый элемент), либо использовать целое деление, предварительно убедившись в чётности суммы. Ниже продемонстрированы оба способа решения.
Пример правильной программы на языке Паскаль (способ 1)
k:=0;
for i:=3 to N do begin
if 2*a[i] = a[i-1] + a[i-2]
then k := k+1;
end;
writeln(k)
Пример правильной программы на языке Паскаль (способ 2)
k:=0;
for i:=3 to N do begin
if ((a[i-1] + a[i-2]) mod 2 = 0) and
((a[i-1] + a[i-2]) div 2 = a[i])
then k := k+1;
end;
writeln(k)

