Как найти минимальное четное число в массиве

Помогите пожалуйста написать программу на питон, которая будет находить в одномерном массиве минимальное чётное число и максимальное нечётное число.
Программа в основном написана, но не получается найти минимальное чётное число.

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's user avatar

Kromster

13.5k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 14 мая 2021 в 5:29

Начинающий's user avatar

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

Danis's user avatar

DanisDanis

19.1k5 золотых знаков20 серебряных знаков55 бронзовых знаков

3

novi4o

0 / 0 / 0

Регистрация: 24.05.2015

Сообщений: 13

1

Минимальный четный элемент

24.05.2015, 22:01. Показов 10782. Ответов 11

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток, уважаемые форумчане Пожалуйста, помогите с кодом задачи: “Ввести массив А(N). Найти минимальный элемент среди четных и максимальный среди нечетных элементов массива.”
Максимальный нечетный выдает правильно, а вот минимальный четный…

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    const int n = 10;
    int a[n] = {-5, 3, 1, 0, -7, -1, 45, 6, 8, 12};
    int min1 = a[0], max2 = a[0];
    for (int i = 1; i < n; i++)
    {
        if (a[i] % 2 == 0 && a[i] < min1)
        {
            min1 = a[i];
        }
        if (a[i] % 2 != 0 && a[i] > max2)
        {
            max2 = a[i];
        }
    }
    cout << "min1 = " << min1 << 'n';
    cout << "max2 = " << max2 << 'n';
    system("pause");
    return 0;
}



0



isobo531

50 / 49 / 29

Регистрация: 11.11.2014

Сообщений: 332

24.05.2015, 22:09

2

Если ты определяешь нечетный максимальный, то такое условие у тебя не правильно:

Цитата
Сообщение от novi4o
Посмотреть сообщение

if (a[i] % 2 != 0 && a[i] > max2)

Нужно сделать так

C++
1
if (a[i] % 2 == 1 && a[i] > max2)



0



XZentus

202 / 200 / 65

Регистрация: 06.10.2013

Сообщений: 552

24.05.2015, 22:12

3

А если расставить приоритеты?

C++
1
2
((a[i] % 2) == 0) && (a[i] < min1)
((a[i] % 2) != 0) && (a[i] > max2)

Добавлено через 2 минуты
isobo531, Там всего 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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    const int n = 10;
    int a[n] = {-5, 3, 1, 0, -7, -1, 45, 6, 8, 12};
    int min1 = a[0], max2 = a[0];
    bool flagMin = false, flagMax = false;
    
    for (int i = 1; i < n; i++)
    {
        if (a[i] % 2 == 0 && a[i] < min1)
        {
            min1 = a[i];
            flagMin = true;
        }
        if (a[i] % 2 != 0 && a[i] > max2)
        {
            max2 = a[i];
            flagMax = true;
        }
    }
    
    if ( flagMin == true ) {
        cout << "min1 = " << min1 << 'n';
    } else {
        cout << "No current Min elementn";
    }
    
    if ( flagMax == true ) {
        cout << "max2 = " << max2 << 'n';
    } else {
        cout << "No current Max elementn";
    }
 
    system("pause");
 
    return 0;
}



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 минуту
Ладно, хватит стебаться (:
novi4o,
Инициализировать min1 нужно первым элементом, который входит в число рассматриваемых, а не первым элементом массива!



0



41 / 41 / 36

Регистрация: 13.04.2015

Сообщений: 83

24.05.2015, 22:20

8

Цитата
Сообщение от XZentus
Посмотреть сообщение

т.е. в массиве среди всех четных может не быть минимального элемента?

нет, может не быть минимального если все элементы нечетные.



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] с числом, а надо наоборот:
min < a[i]
max > 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 как решение

Решение

Не доглядел, что у ТС привязка идет к первым элементам.
Верный вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <climits>
 
int main() {
    int size = 10;
    int array[] = {-5, 3, 1, 0, -7, -1, 45, 6, 8, 12};
    int min = INT_MAX, max = INT_MIN;
    bool flagMin = false, flagMax = false;
 
    for ( int i = 0; i < size; i++ ) {
        if ( array[i] % 2 == 0 && min > array[i] ) {
            min = array[i];
            flagMin = true;
        }
        if ( array[i] % 2 != 0 && max < array[i] ) {
            max = array[i];
            flagMax = true;
        }
    }
 
    if ( flagMin == true ) {
        std::cout << "Min: " << min << std::endl;
    } else {
        std::cout << "No current Min element" << std::endl;;
    }
 
    if ( flagMax == true ) {
        std::cout << "Max: " << max << std::endl;
    } else {
        std::cout << "No current Max element" << std::endl;;
    }
 
    return 0;
}



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
5  -2  14  7  -4  23  0  8  6  -1

-4

10
0  4  5  2  77  62  4  8  0  45

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  -2  14  7  -4  23  0  8  6  -1

5

10
0  4  5  2  77  62  4  8  0  45

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
5  -2  14  7  -4  23  0  8  -4  -1

2

10
0  4  5  2  77  0  4  8  0  45

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
5  -2  14  7  -4  22  0  -8  -6  -1

-6

10
0  4  5  -10  77  0  4  -12  0  45

-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
195 264 127 936 658 152 339 504 395 553

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
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

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
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

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.

Задачи для самостоятельного решения:

  1. Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 ­– рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
  2. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
  3. Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
  4. Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
  5. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
  6. Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
  7. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.

Источники информации

  1. Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
  2. Сайт К. Полякова 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;

Добавить комментарий