C# Перевести из Паскаля в C#
uses crt;
const n=3;
var
i,max,min: integer;
mas:array[1..n] of integer;
begin
clrscr;
randomize;
for i:=1 to n do
begin
write('Масса ',i, ' человека = '); Readln(mas[i]);
end;
max:=mas[1];
min:=mas[1];
for i:=2 to n do
begin
If mas[i] max Then
max:=mas[i];
end;
If (max/2)>min Then
writeln('Масса самого тяжелого человека превышает массу самого легкого более чем в два раза')
Else
writeln('Масса самого тяжелого человека НЕ превышает массу самого легкого более чем в два раза');
end
На первый взгляд кажется, что задача простая. Поскольку последовательность состоит из целых чисел, то среди них могут быть и отрицательные, а значит, минимальное произведение получится, если умножить максимальное положительное число на минимальное отрицательное. Однако, это не так, если в последовательность входят только положительные или только отрицательные числа, поэтому такие случаи требуют особого рассмотрения.
Если все элементы последовательности положительные, то очевидно, что минимальное произведение – это произведение двух минимальных элементов последовательности. Если же все элементы последовательности отрицательные, то как ни странно, минимальное произведение дадут два максимальных элемента последовательности (так как они по модулю ближе всех к нулю, а минус на минус даёт плюс).
Таким образом, получается, что нам необходимо найти в последовательности два максимальных и два минимальных элемента, а потом выбрать минимальное произведение из трёх. Для одновременного поиска двух максимальных элементов можно использовать стратегию «турнирной таблицы». После считывания каждого элемента нужно будет сравнивать его с текущими значениями первого и второго максимума, и разбирать случаи. Их будет три. Первый случай – очередной элемент последовательности больше текущего значения первого максимума. Тогда нужно первый максимум опустить на вторую позицию, а на первую позицию записать новый элемент. Второй случай – элемент не больше первого максимума (возможно, что равен ему), но больше второго. Тогда первый максимум не изменяется, а на вторую позицию записывается считанный элемент. Третий случай – элемент не больше второго максимума (возможно, что равен ему). В этом случае нам не нужно предпринимать никаких действий. Минимумы ищутся аналогично.
Остаётся последний вопрос – какие начальные значения задать максимумам и минимумам. По аналогии с задачей № 2 в максимумы нужно записывать числа, которые гарантированно меньше любого элемента последовательности, а в минимумы – числа, которые гарантированно больше любого элемента последовательности.
var a,max1,max2,min1,min2,p:integer;
begin
max1 := -10001;
max2 := -10001;
min1 := 10001;
min2 := 10001;
read(a);
while a <> 0 do begin
if a > max1
then begin
max2 := max1;
max1 := a
end
else if a > max2 then max2 := a;
if a < min1
then begin
min2 := min1;
min1 := a
end
else if a < min2 then min2:=a;
read(a)
end;
p := max1 * min1;
if max1 * max2 < p then p := max1 * max2;
if min1 * min2 < p then p := min1 * min2;
writeln(p)
end.
Так как язык не указан, приведу пример на SWI-Prolog.
Код:
read_int(Int) :- read(Int), integer(Int).split_int_by_numbers(0, []) :- !. split_int_by_numbers(N, [Number|Ints]) :- Number is mod(N, 10), RestN is div(N, 10), split_int_by_numbers(RestN, Ints).test_to_div(_, []).test_to_div(N, [Number|Ints]) :- mod(N, Number) =:= 0, test_to_div(N, Ints). test(Int) :- split_int_by_numbers(Int, Numbers), test_to_div(Int, Numbers), write(Int), write(" - Yes!"), nl.test(Int) :- write(Int), write(" - No!"), nl.?- read_int(Int), test(Int).