Помогите пожалуйста написать программу на питон, которая будет находить в одномерном массиве минимальное чётное число и максимальное нечётное число.
Программа в основном написана, но не получается найти минимальное чётное число.
n=int(input("Введите количество элементов, которые будут в списке:"))
b=[]
for i in range(0,n):
a=int(input("Элемент:"))
b.append(a)
c=[]
d=[]
for i in b:
if(i%2==0):
c.append(i)
else:
d.append(i)
c.sort()
d.sort()
count1=0
count2=0
for k in c:
count1=count1-1
for j in d:
count2=count2+1
print("Минимальное четное число:",c[count1+1])
print("Максимальное нечетное число",d[count2-1])
Kromster
13.5k12 золотых знаков43 серебряных знака72 бронзовых знака
задан 14 мая 2021 в 5:29
4
n = int(input("Введите количество элементов, которые будут в списке:"))
b = []
for i in range(n):
a = int(input("Элемент:"))
b.append(a)
c = []
d = []
for i in b:
if i % 2 == 0:
c.append(i)
else:
d.append(i)
c.sort()
d.sort()
print("Минимальное четное число:",c[0])
print("Максимальное нечетное число",d[-1])
ответ дан 14 мая 2021 в 5:42
DanisDanis
19.1k5 золотых знаков20 серебряных знаков55 бронзовых знаков
3
novi4o 0 / 0 / 0 Регистрация: 24.05.2015 Сообщений: 13 |
||||
1 |
||||
Минимальный четный элемент24.05.2015, 22:01. Показов 10782. Ответов 11 Метки нет (Все метки)
Доброго времени суток, уважаемые форумчане Пожалуйста, помогите с кодом задачи: “Ввести массив А(N). Найти минимальный элемент среди четных и максимальный среди нечетных элементов массива.”
0 |
isobo531 50 / 49 / 29 Регистрация: 11.11.2014 Сообщений: 332 |
||||
24.05.2015, 22:09 |
2 |
|||
Если ты определяешь нечетный максимальный, то такое условие у тебя не правильно:
if (a[i] % 2 != 0 && a[i] > max2) Нужно сделать так
0 |
XZentus 202 / 200 / 65 Регистрация: 06.10.2013 Сообщений: 552 |
||||
24.05.2015, 22:12 |
3 |
|||
А если расставить приоритеты?
Добавлено через 2 минуты
0 |
50 / 49 / 29 Регистрация: 11.11.2014 Сообщений: 332 |
|
24.05.2015, 22:14 |
4 |
XZentus, В принципе разницы нет, но мне было удобнее если “== 1”
0 |
dcStep 41 / 41 / 36 Регистрация: 13.04.2015 Сообщений: 83 |
||||
24.05.2015, 22:15 |
5 |
|||
0 |
0 / 0 / 0 Регистрация: 24.05.2015 Сообщений: 13 |
|
24.05.2015, 22:16 [ТС] |
6 |
Нет, к сожалению, ни первое, ни второе не помогает.
0 |
202 / 200 / 65 Регистрация: 06.10.2013 Сообщений: 552 |
|
24.05.2015, 22:19 |
7 |
dcStep, т.е. в массиве среди всех четных может не быть минимального элемента? Добавлено через 1 минуту
0 |
41 / 41 / 36 Регистрация: 13.04.2015 Сообщений: 83 |
|
24.05.2015, 22:20 |
8 |
т.е. в массиве среди всех четных может не быть минимального элемента? нет, может не быть минимального если все элементы нечетные.
0 |
202 / 200 / 65 Регистрация: 06.10.2013 Сообщений: 552 |
|
24.05.2015, 22:20 |
9 |
Иначе первый нечетный элемент, который меньше любого из четных, ваш алгоритм не изменит.
0 |
0 / 0 / 0 Регистрация: 24.05.2015 Сообщений: 1 |
|
24.05.2015, 22:21 |
10 |
во первых в любом случае перебирать массив надо с нуля, во вторых ты сравниваешь a[i] с числом, а надо наоборот:
0 |
0 / 0 / 0 Регистрация: 24.05.2015 Сообщений: 13 |
|
24.05.2015, 22:21 [ТС] |
11 |
Судя по массиву чисел, минимальным четным будет 6, но в итоге все равно выдает “Отсутствие минимального элемента”.
0 |
dcStep 41 / 41 / 36 Регистрация: 13.04.2015 Сообщений: 83 |
||||
24.05.2015, 22:28 |
12 |
|||
Сообщение было отмечено novi4o как решение Решение Не доглядел, что у ТС привязка идет к первым элементам.
2 |
The posted code, to find the maximum even number, follows this steps
int max = 0;
// ...
{
// ...
if (a >= max && a % 2 == 0) { max = a; }
}
if (max == 0) { max = -1; }
The quoted problem, though, doesn’t seem to specify the range of the input values. So this would give to wrong result for every even value less than zero.
A similar issue is present in the logic used to find the minimum, which assumes that all the odd values are less than or equal to INT16_MIN
.
if the input (…) 2 4 2 5 4
the output should be: -1 4 or 5 4?
To my understanding of the quoted problem, the output should be 5 4.
It would be -1 4 if the numbers were, e.g. 2 4 2 6 4 (no odd numbers).
To ensure that the found extremes are valid, you can use a couple of sentinel values, that is a values that can’t possible be a (minimum) odd number and one that can’t be a (maximum) even number:
const int odd_sentinel = 0; // It isn't odd...
const int even_sentinel = -1; // It's not even
int min_odd = odd_sentinel;
int max_even = even_sentinel;
int x;
while ( std::cin >> x )
{
if ( x % 2 )
{
if ( min_odd == odd_sentinel || x < min_odd )
min_odd = x;
}
else
{
if ( max_even == even_sentinel || x > max_even )
max_even = x;
}
}
std::cout << (min_odd == odd_sentinel ? -1 : min_odd) << ' '
<< (max_even == even_sentinel ? -1 : max_even) << 'n';
В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.
1 способ
Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива. | |
Исходные данные: |
Результат: |
10 |
-4 |
10 |
0 |
Считаем, что первый элемент массива – минимальный. Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.
program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.
Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.
Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива. |
|
Исходные данные: |
Результат: |
10 |
5 |
10 |
9 |
Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.
program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.
Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:
var a:array[1..100] of integer;
i,n,imin:integer;
Фрагмент нахождения индекса минимального элемента массива выглядит так:
imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;
Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива. | |
Исходные данные: |
Результат: |
10 |
2 |
10 |
3 |
program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.
Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. | |
Исходные данные: |
Результат: |
10 |
-6 |
10 |
-10 |
В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.
Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.
Итак, находим минимальный элемент вторым способом.
2 способ
Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.
program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
min:=a[i];
//вывод результата
writeln;
write(min);
end.
Проверяем на тестах:
10 411 837 755 90 520 203 581 798 401 640 |
90 |
10 |
658 |
Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:
program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
min:=a[j];
//вывод результата
writeln;
write(min);
end.
Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). | |
Исходные данные: |
Результат: |
10 |
14 |
10 |
45 |
Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.
Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.
program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.
Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей). Если таких чисел нет, нужно вывести ответ 0. | |
Исходные данные: |
Результат: |
20 |
14 |
10 |
45 |
Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.
Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.
program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
//заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
writeln(0)
else
writeln(min);
end.
Задачи для самостоятельного решения:
- Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 – рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
- Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
- Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
- Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.
Источники информации
- Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
- Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm
Ученик
(96),
закрыт
9 лет назад
Jurii
Высший разум
(175099)
9 лет назад
positive := true;
for i := 1 to ArraySize do
positive := positive and (a[ i ] > 0);
if positive then
begin
minFind := false;
for i := 1 to ArraySize do
if not odd(a[ i ]) then
if minFind then
begin if min > a[ i ] then min := a[ i ]; end
else
begin min := a[ i ]; minFind := true; end;
if minFind then
WriteLn(‘минимальный чётный = ‘, min)
else
WriteLn(‘нет чётных элементов в массиве’);
end
else
begin
WriteLn(‘все нечётные элементы заменены на 0:’);
for i := 1 to ArraySize do
begin
if odd(a[ i ]) then
a[ i ] := 0;
Write(a[ i ], ‘ ‘);
end;
WriteLn;
end;