Задание:
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Паскаль |
const N=30; |
Си |
#include<stdio.h> |
Естественный язык |
Объявляем массив A из 30 элементов. Объяв-ляем целочисленные переменные i, k, max, max2. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. ... |
Решение:
Сложность в том, что нужно найти не максимальный элемент, а второй по величине. Можно, конечно, сначала найти максимум, а потом искать следующий за ним, но можно сделать это за один проход по массиву. Нам нужны две переменные, max (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max, а второй по величине записываем в max2:
if a[1] > a[2] then begin
max:=a[1]; max2:=a[2];
end
else begin
max:=a[2]; max2:=a[1];
end;
Затем в цикле перебираем все элементы, начиная с 3-го (первые два уже «задействованы»!) до последнего, 30-ого. Если очередной элемент a[i] больше, чем max, записываем значение max в max2 (предыдущий максимум становится вторым), а значение a[i] – в max. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2. Вот решение на Паскале
const N=30;
var a: array [1..N] of integer;
i, k, max, max2: integer;
begin
for i:=1 to N do readln(a[i]);
if a[1] > a[2] then begin
max:=a[1]; max2:=a[2]
end
else begin
max:=a[2]; max2:=a[1]
end;
for i:=3 to N do
if a[i] > max then begin
max2 := max;
max := a[i]
end
else if a[i] > max2 then max2 := a[i];
writeln(max2)
end.