Как вычислить 2 наименьших нечетных элемента массива в языке С?

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

Первый способ заключается в использовании временных переменных для хранения двух наименьших нечетных чисел и последовательного прохода по массиву для поиска и обновления этих переменных:

#include <stdio.h>

void findTwoSmallestOdd(int arr[], int size) {
    int smallestOdd = __INT_MAX__;
    int secondSmallestOdd = __INT_MAX__;

    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 != 0) {
            if (arr[i] < smallestOdd) {
                secondSmallestOdd = smallestOdd;
                smallestOdd = arr[i];
            }
            else if (arr[i] < secondSmallestOdd) {
                secondSmallestOdd = arr[i];
            }
        }
    }

    printf("Первое наименьшее нечетное число: %dn", smallestOdd);
    printf("Второе наименьшее нечетное число: %dn", secondSmallestOdd);
}

int main() {
    int arr[] = {2, 8, 5, 9, 12, 4, 1, 7, 6};
    int size = sizeof(arr) / sizeof(arr[0]);

    findTwoSmallestOdd(arr, size);

    return 0;
}

В данном коде мы проходим по каждому элементу массива и проверяем на нечетность с помощью оператора %. Если элемент массива нечетный, то проверяем его на минимальность. Если он меньше текущего наименьшего нечетного числа (smallestOdd), то обновляем переменные соответствующим образом. Если элемент больше или равен (>=) текущему наименьшему нечетному числу, но меньше текущего второго наименьшего нечетного числа (secondSmallestOdd), то обновляем только переменную secondSmallestOdd. В результате получаем первое и второе наименьшие нечетные числа.

Второй способ заключается в сортировке массива и выборе первых двух нечетных чисел:

#include <stdio.h>

void findTwoSmallestOdd(int arr[], int size) {
    // Сортировка массива в порядке возрастания
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

    int smallestOdd = -1;
    int secondSmallestOdd = -1;

    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 != 0) {
            if (smallestOdd == -1) {
                smallestOdd = arr[i];
            }
            else if (secondSmallestOdd == -1) {
                secondSmallestOdd = arr[i];
            }
        }
    }

    printf("Первое наименьшее нечетное число: %dn", smallestOdd);
    printf("Второе наименьшее нечетное число: %dn", secondSmallestOdd);
}

int main() {
    int arr[] = {2, 8, 5, 9, 12, 4, 1, 7, 6};
    int size = sizeof(arr) / sizeof(arr[0]);

    findTwoSmallestOdd(arr, size);

    return 0;
}

В данном коде мы используем сортировку пузырьком (bubble sort) для сортировки элементов массива в порядке возрастания. Затем мы проходим по отсортированному массиву и выбираем первые два нечетных числа. Этот способ работает, но требует дополнительной памяти и времени для сортировки.

Оба способа приведены как примеры и могут быть адаптированы под конкретные требования вашей задачи.