Рассмотрим две задачи.
1.Дан массив, содержащий 2016 положительных целых чисел, не превышающих 1000. Необходимо найти и вывести максимальный из тех элементов этого массива, чётность которых совпадает с чётностью произведения всех элементов.
Например, в массиве из шести элементов, равных соответственно 2, 3, 1, 5, 6, 4, произведение всех элементов чётно, значит, ответом будет максимальный чётный элемент, то есть 6.
Напишите на одном из языков программирования программу для решения этой задачи. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из описанных.
const N=2016; var a: array [1..N] of integer; i, m, k: integer; begin for i:=1 to N do readln(a[i]); … end.
РЕШЕНИЕ:- Анализируем условие задачи и данный фрагмент программы. Если решать на прямую, т.е. искать произведение всех элементов чтобы определить его четность, мы столкнемся с проблемой сохранения результата этого произведения. Все переменные целого типа, а он как вы понимаете очень ограничен (-32568..32567). Предварительная оценка произведения элементов массива, даже если все они будут равны 2 составит два в 2016-й степени, а они могут доходить и до 1000. Следовательно, находить произведение элементов массива невозможно ("Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из описанных"). Но можно догадаться что, если хотя бы один элемент массива будет четным, то и все произведение будет четным. Это и будем проверять.
randomize; k:=1;
for i:=1 to N do
begin
a[i]:=random(1000)+1;
if a[i] mod 2 =0 then k:=0;
end;
- В этом фрагменте мы используем генератор случайных чисел для заполнения массива (randomize; ... a[i]:=random(1000)+1;) и определяем четность каждого элемента массива ( if a[i] mod 2 =0 then k:=0;) В начале фрагмента мы переменной k присваиваем 1 (k:=1;) и т.к. нам достаточно хотя бы одного четного элемента. то при выполнении условия a[i] mod 2 =0 мы меняем значение k на равное 0. Если этого ни разу не произойдет, т.е. все элементы массива будут нечетными, то k останется равным 1.
- Теперь в зависимости от значения k мы будем искать максимальный четный элемент (если k=0) или максимальный нечетный элемент в противном случае.
if k=0 then begin
{ поиск максимального четного элемента} end;
else begin
f{ поиск максимального нечетного элемента} end;
- Поиск максимального осуществляется классическим способом. Переменную m делаем равной нулю. и перебирая все элементы массива сперва определяем их четность ( if a[i] mod 2=0 then или if a[i] mod 2=1 then ), затем сравниваем с максимальным m, при необходимости меняем максимальный (m:=a[i];). Остается вывести результат ( write(m);).
const2. Опишите на русском языке или одном из языков программирования алгоритм вычисления разности между средним арифметическим максимального и минимального значений элементов заданного целочисленного массива из 30 элементов и средним арифметическим всех элементов этого массива.
N=2016;
var
a: array [1..N] of integer;
i, m, k: integer;
begin
randomize; k:=1;
for i:=1 to N do
begin
a[i]:=random(1000)+1;
if a[i] mod 2 =0 then k:=0;
end;
m:=0;
if k=0 then begin
for i:=1 to n do
if a[i] mod 2=0 then
if a[i]>m then m:=a[i]end
else begin
for i:=1 to n do
if a[i] mod 2=1 then
if a[i]>m then m:=a[i];end;
write(m);
end.
РЕШЕНИЕ:
- Описываем константу n - количество элементов массива
- Описываем переменные: а - целочисленный массив, i, sum, max, min -переменные целого типа
- При заполнения массива с клавиатуры сразу находим сумму элементов массива (sum).
- В следующем цикле ищем максимальный и минимальный элементы, выбрав для начального их значения первый элемент массива (max:=a[1];min:=a[1];).
- Выводим результат - разность между средним арифметическим максимального и минимального значений элементов ((max+min)/2) и средним арифметическим всех элементов этого массива (sum/n), задав формат вывода результата :3:2
const
n=30;
var
a: array [1..n] of integer;
i, max,min, sum: integer;
begin
sum:=0;
for i:=1 to n do
begin
readln(a[i]);
sum:=sum+a[i];
end;
max:=a[1];min:=a[1];
for i:=2 to n do
begin
if a[i] > max then max:=a[i];
if a[i] < min then min:=a[i];
end;
write((max+min)/2-(sum/n):3:2);
end.
Также можно прочитать эту запись
Комментариев нет:
Отправить комментарий