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

Chayka2020

0 / 0 / 0

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

Сообщений: 6

1

Найти минимальный нечетный элемент последовательности

28.02.2019, 05:36. Показов 19988. Ответов 13

Метки python 3.7 (Все метки)


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

Дана последовательность из n чисел (n вводится с клавиатуры). Найти минимальное нечетное число или вывести сообщение, что нет такого.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
n = int(input('Сколько чисел?  '))
print('Введите эти числа:   ')
 
m = int(input())
for i in range (n-1):
   a = int(input())
   if a< m and a % 2 != 0:
      m = a
 
 
if m:
    print ('минимальное нечетное', m)
else:
    print ('нет такого числа')

Если делать так, то не проверено первое число.
Как нужно исправить код?



0



Arsegg

3478 / 2086 / 559

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

Сообщений: 5,328

28.02.2019, 06:31

2

Python
1
2
3
4
5
6
7
8
9
10
11
def main():
    n = int(input("n = "))
    a = [int(input()) for i in range(n)]
    minOdd = min(filter(lambda x: x % 2 == 1, a), default = None)
    if minOdd is None:
        print("Такого числа нет.")
    else:
        print("Минимальное нечетное число", minOdd)
 
if __name__ == "__main__":
    main()



0



0 / 0 / 0

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

Сообщений: 6

28.02.2019, 08:24

 [ТС]

3

Спасибо, хорошее решение.
Но нужно сделать максимально просто, для обычной школы. Они lambda функции не проходят.



0



Arsegg

3478 / 2086 / 559

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

Сообщений: 5,328

28.02.2019, 08:52

4

Лучший ответ Сообщение было отмечено Chayka2020 как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
def main():
    n = int(input("n = "))
    a = [int(input()) for i in range(n)]
    minOdd = min((x for x in a if x % 2 == 1), default = None)
    if minOdd is None:
        print("Такого числа нет.")
    else:
        print("Минимальное нечетное число", minOdd)
 
if __name__ == "__main__":
    main()



1



Dax

Модератор

Эксперт Python

1353 / 650 / 207

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

Сообщений: 3,054

28.02.2019, 10:05

5

Chayka2020, пойдет?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import  random
def masgen(n):
    for i in range(2,10):
        mlist.append(i)
    print(mlist)
    for i in mlist:
        if(min(mlist)%2==0):
            print(min(mlist))
        elif print("нету")
 
 
if __name__ == '__main__':
    n=int(input())
    mlist=[]
    masgen(n)



1



0 / 0 / 0

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

Сообщений: 6

28.02.2019, 10:30

 [ТС]

6

Большое спасибо за идею! Убрать бы еще и функцию…
Это средние классы школы, господа!))



0



Semen-Semenich

4465 / 3145 / 1112

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

Сообщений: 7,829

28.02.2019, 14:19

7

Python
1
2
3
4
5
6
7
8
9
10
11
n = int(input('Сколько чисел?  '))
print('Введите эти числа:   ')
m = int(input())
for i in range (n-1):
    a = int(input())
    if a< m and a % 2 != 0:
        m = a
if m and m % 2 != 0:
    print ('минимальное нечетное', m)
else:
    print ('нет такого числа')



0



0 / 0 / 0

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

Сообщений: 6

28.02.2019, 14:47

 [ТС]

8

Увы, нет. Первое число вне цикла не обрабатывается. Вот и ломаю голову!
Протестируйте на последовательности 5 чисел: 0 1 2 3 4



0



3478 / 2086 / 559

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

Сообщений: 5,328

28.02.2019, 15:05

9

Semen-Semenich,

Не по теме:

при n = 0 можно bsod словить.



0



SergeyDe

49 / 21 / 6

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

Сообщений: 55

28.02.2019, 15:26

10

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
num_list = [7, 5, 90, 1, 3, 5, 7, 9]
m = None
while num_list:
    m = min(num_list)
    if m % 2 == 1:
        break
    num_list.remove(m)
 
if num_list:
    print(m)
else:
    print("Нет искомого числа")
print(num_list)

Добавлено через 8 минут
Можно еще так, с сохранением исходного списка, и более быстрый вариант

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
src_list = [0, 1, 3,6,3,7,5,9,8,4,2,1]
# получим отсортированную копию списка
num_list = sorted(src_list)
m = None
while num_list:
    m = min(num_list)
    if m % 2 == 1:
        break
    num_list.remove(m)
 
if num_list:
    print(m)
else:
    print("Нет искомого числа")
print(num_list)



1



0 / 0 / 0

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

Сообщений: 6

28.02.2019, 15:48

 [ТС]

11

И опять не оно… У нас задачка для 7 класса. Им не важна производительность и оптимальность.

Дана последовательность из n чисел (n вводится с клавиатуры). И сами числа – тоже с клавиатуры.
Прерывание цикла школьники не используют.
Пользовательские функции не пишут.
Прямо не знаю, что и предпринять!



0



Arsegg

3478 / 2086 / 559

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

Сообщений: 5,328

28.02.2019, 16:33

12

Chayka2020,

Python
1
2
3
4
5
6
7
количество = int(input("Введите n: "))
минимальноеНечетноеЧисло = None
for i in range(количество):
    число = int(input())
    if число % 2 == 1 and (минимальноеНечетноеЧисло is None or число < минимальноеНечетноеЧисло):
        минимальноеНечетноеЧисло = число
print(минимальноеНечетноеЧисло)



1



0 / 0 / 0

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

Сообщений: 6

28.02.2019, 18:20

 [ТС]

13

Всё, я поняла, что всех достала)))
Спасибо, коллеги, что поддержали советами. Постараюсь теперь что-то придумать сама. Если получится – отпишусь, ради спортивного интереса.



0



Semen-Semenich

4465 / 3145 / 1112

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

Сообщений: 7,829

28.02.2019, 20:16

14

Лучший ответ Сообщение было отмечено Chayka2020 как решение

Решение

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

Первое число вне цикла не обрабатывается

нет оно обрабатывается но не выполняются 2 условия. это что то я упустил

Python
1
2
if a< m and a % 2 != 0:
      m = a

то есть a всегда больше m которое равно 0 и второе

Python
1
if m and m % 2 != 0:

то есть 0 == False

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = int(input('Сколько чисел?  '))
print('Введите эти числа:   ')
m = int(input())
x = 1
while not m % 2:
    m = int(input())
    x += 1
for i in range (n-x):
    a = int(input())
    if a< m and a % 2 != 0:
        m = a
if m and m % 2 != 0 :
    print ('минимальное нечетное', m)
else:
    print ('нет такого числа')

тут правда не считается количество вводов, если будет введено больше 5ти четных чисел то ввод будет продолжаться до первого нечетного. вообщем требует доработки но суть думаю понятна



1



Пусть дано:Вывести номера всех минимальных нечетных элементов. Нумерация
начинается с нуля. Если таких элементов нет, то вывести сообщение об
этом.n =8 Массив =0, 5, 9, 1, 2, 7, 1, 3 Результат = 3 6
n =8 Массив= 2, 6, 10, 6, 8, 8, 8, 2 Результат = нечетных элементов нет
Вот мой вариант:

//вывести номера всех минимальных нечётных элементов массива
#include <iostream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Rus");
    int n;
    cout << "Введите размерность массива - ";
    cin >> n;
    int* a = new int[n];
    for (int i = 0; i < n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
    int min = a[0];
    for (int i = 0; i < n; i++) 
    {
        if (a[i] % 2 != 0) 
        {
            if (a[i] < min) min = a[i];
        }
        else if (a[i] == min)
            cout << "Номера всех минимальных нечётных элементов равна " << n;
        cout << endl;         
    }
    if (min % 2 == 0)
        cout << "не чётных элементов нет/n" << endl;
    cout << min << endl;
    delete []a;
    return 0;
}

Что тут не верно?Помогите исправить пожалуйста.Не серчайте,я только учусь работать с массивами…Задача всё ещё не решена.

This code is supposed to find the smallest odd number in given array and store it in min but when I try to print min it always prints 0.

int smallestodd(int x[5]){
  int j;
  int k[5];
  int p = 0;
  int r = 0;

  for(int h =0; h<5;h++){

    j = x[h] % 2;
    if(j == 1){
      int temp =x[h];
      k[p] =temp;
      p++;
    }
  }

  int min = k[0];


  while(k[r] !=0){
    if(k[r] < min ){
      min = k[r];
      r++;
    }
  }

  return min;
}

delirium's user avatar

delirium

8686 silver badges20 bronze badges

asked Jan 14, 2019 at 11:01

muhammed kartal's user avatar

10

Assuming there is an odd number in the array — let’s say trying to find the minimum odd number in an array with just even numbers (or no numbers) is UB 🙂

index = 0;
while (arr[index] % 2 == 0) index++; // skip even numbers
min = arr[index++]; // first odd number
while (index < length) {
    if (arr[index] % 2) {
        if (arr[index] < min) min = arr[index];
    }
    index++;
}

answered Jan 14, 2019 at 11:18

pmg's user avatar

pmgpmg

106k13 gold badges125 silver badges198 bronze badges

2

this code avoid overflow in search and return 1 when found or 0 if array has only even numbers.

int getMinOdd(int arr[], int length, int *value) {
    int found = 0;
    for(int idx=0; idx < length; idx++) {
        if (arr[idx] % 2) {
            if (!found || *value > arr[idx]) {
                *value = arr[idx];
            }
            found = 1;
        }
    }
    return found;
}

answered Jan 14, 2019 at 11:51

seduardo's user avatar

seduardoseduardo

7046 silver badges6 bronze badges

It’s quite simple actually. You need to just check 2 conditions on your array.

int smallestOdd(int arr[]){
    int min = 99999; //Some very large number
    for(int i = 0; i < (length of your array); i++) {
        if(arr[i]%2 != 0 && arr[i] < min) { //Check if number is odd and less than the current minimum value
            min = arr[i];
        }
    }
    return min;
}

answered Jan 14, 2019 at 11:11

Karan's user avatar

KaranKaran

645 bronze badges

3

Use this using statement as first :

Using System Linq;

Console.WriteLine(myArray.Where(i => i%2 == 1).Min());

answered Mar 19, 2022 at 8:13

COBIEN's user avatar

Найти наименьший нечетный элемент в одномерном массиве. (Паскаль)



Ученик

(79),
на голосовании



7 лет назад

Голосование за лучший ответ

Александр Погребняк

Высший разум

(206904)


7 лет назад

Первое, что пришло в голову. Может и неоптимально…
1. Перед циклом будем считать минимальным нечетным любое четное число, например, 2
2. В цикле. Если min=2 и текущий элемент нечетный, то min присваиваем значение этого элемента. Иначе, если элемент нечетный и он меньше минимального, то он становится минимальным
3. После цикла проверяем: если min так и остался двойкой, то выводим сообщение, что нечетных элементов в массиве нет
Подробнее нужно – пишите на почту

Условие задачи: Массив задан датчиком случайных чисел на интервале [-37, 66]. Найти наименьший нечетный элемент. Размер произвольный. (Язык Pascal)

Сложность: легкая.

Решение задачи

Для начала продумаем наше решение. Ну само собой сначала заполним массив случайными числами с помощью цикла, затем с помощью другого цикла найдем наименьший нечетный элемент.

Для того чтобы решить задачу нам понадобятся следующие переменные:

  • Переменная mass — для массива
  • Переменная i — для цикла for
  • Переменная min — для минимального нечетного элемента
  • Переменная count — для кол-ва элементов массива
  • Начнем мы с каркаса нашей программы

    type

    massiv =
    array
    [
    1..100
    ]
    of
    integer
    ;
    // создаём свой тип данных для массива

    var

    mass : massiv;
    // объявляем

    i, min, count :
    integer
    ;
    // переменные
    begin

    randomize;
    // включаем генератор случайных чисел


    write
    (
    'Введите размер массива : '
    );readln(count);
    // вводим размер массива
    end
    .

    Тут мы создали свой тип данных для массива, как и зачем читайте ( тут ) включили генератор случайных чисел , подробнее (тут), ну и попросили пользователя ввести кол-во элементов массива.

    Теперь давайте заполним наш массив случайными числами с помощью цикла for и выведем все его элементы, цикл должно у нас быть от 1 до количества элементов, чтобы заполнить весь массив, пишем:

    for
    i:=
    1
    to
    count
    do
    // пускаем цикл для заполнения массива

    begin

    mass[i] := random(
    104
    ) -
    37
    ;
    // присваиваем случайное число

    write
    (mass[i],
    ' | '
    );
    // выводим число

    end
    ;

    Для того чтобы найти минимальный элемент делается следующее, для начала задаётся начальное значение переменной min, обычно это первое значение массива, дальше оно уже сравнивается со всеми остальными элементами массива и если какое-то меньше min, то уже оно становится минимальным, но также надо не забыть проверить на нечетность.

    min := mass[
    1
    ];
    // за минимальный элемент берем 1-е число, чтобы было с чем сравнивать

    for
    i:=
    2
    to
    count
    do
    // ищем минимальный элемент

    if
    (mass[i] < min)
    AND
    (mass[i]
    mod
    2
    <>
    0
    )
    then
    // проверяем его на условие, если прошло условие

    min := mass[i];
    // присваиваем новое значение

    i = 2 , потому что первый элемент у нас уже известен min := mass[1] смысла сравнивать первый элемент с первым нету.

    После этого цикла у нас должен быть найден наименьший нечетный элемент, но может быть такая ситуация что начальное значение переменной min и есть наименьший элемент, т.е. все остальные элементы больше начального значения, в этом случаи нам надо проверить и его на нечетность:

    if
    ( min
    mod
    2
    <>
    0
    )
    then
    // если вдруг минимальным остался самый первый элемент, то надо его тоже проверить на четность

    writeln
    (
    'Минимальный элемент равен : '
    , min)
    else

    writeln
    (
    'В массиве нет нечетных элементов!'
    );

    Т.е. если последнее число которое содержится в переменной min нечетное то мы его и выводим, иначе говорим что в массиве нет нечетных элементов.

    Всё решение задачи Pascal

    type

    massiv =
    array
    [
    1..100
    ]
    of
    integer
    ;
    // создаём свой тип данных для массива

    var

    mass : massiv;
    // объявляем

    i, min, count :
    integer
    ;
    // переменные
    begin

    randomize;
    // включаем генератор случайных чисел


    write
    (
    'Введите размер массива : '
    );readln(count);
    // вводим размер массива


    for
    i:=
    1
    to
    count
    do
    // пускаем цикл для заполнения массива

    begin

    mass[i] := random(
    104
    ) -
    37
    ;
    // присваиваем случаное число

    write
    (mass[i],
    ' | '
    );
    // выводим число

    end
    ;


    min := mass[
    1
    ];
    // за минимальный элемент берем 1-е число, чтобы было с чем сравнивать


    for
    i:=
    2
    to
    count
    do
    // ищем минимальный элемент

    if
    (mass[i] < min)
    AND
    (mass[i]
    mod
    2
    <>
    0
    )
    then
    // проверяем его на условие, если прошло условие

    min := mass[i];
    // присваиваем новое значение


    writeln
    ;
    // для красоты переносим строку


    if
    ( min
    mod
    2
    <>
    0
    )
    then
    // если вдруг минимальным остался самый первый элемент, то надо его тоже проверить на четность

    writeln
    (
    'Минимальный элемент равен : '
    , min)

    else

    writeln
    (
    'В массиве нет нечетных элементов!'
    );


    readln;
    // чтобы программа не закрывалась
    end
    .

    Предыдущая

    ПрограммированиеЗадачи по Pascal. Найти произведение элементов, кратных 3 в массиве.

    Следующая

    ПрограммированиеЗадачи по Pascal. Определить, являются ли все цифры пятизначного числа четными.

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