Как проверить, содержит ли массив пару чисел, произведение которых нечетное?

Как я могу написать функцию, которая принимает массив целых чисел и возвращает истину, если существует пара чисел, произведение которых нечетно?

Каковы свойства нечетных целых чисел? И, конечно, как написать эту функцию на Java? Также, может быть, краткое объяснение того, как вы формулировали алгоритм для фактической реализации.

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

может, такие вопросы тоже можно пометить как «задача»?

Johannes Schaub - litb 10.11.2008 06:13

Может быть, пометьте их словом «обучение» вместо «домашнее задание»?

Bill the Lizard 10.11.2008 06:38

да, это хорошая идея. «задание» можно спутать с «домашним заданием». «обучение» не так уж и неоднозначно

Johannes Schaub - litb 10.11.2008 07:01

заменил тег "функция" на "обучение"

basszero 10.11.2008 22:23

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

sliderhouserules 18.11.2008 23:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
4 170
6

Ответы 6

Нечетное число не делится на два без остатка. Все, что вам нужно знать, это два нечетных числа в наборе. Просто проверьте, не является ли каждое число по модулю 2 отличным от нуля. Если так, то это странно. Если вы найдете два нечетных числа, вы можете умножить их и получить еще одно нечетное число.

Примечание: нечетное число, умноженное на четное, всегда получается четным.

Произведение двух целых чисел будет нечетным Только, если оба целых числа нечетные. Итак, чтобы решить эту проблему, просто просканируйте массив один раз и посмотрите, есть ли два (или более) нечетных целых числа.

Обновлено: Как уже упоминалось, вы проверяете, является ли число нечетным, используя оператор модуля (%). Если N% 2 == 0, то число четное.

7 + 3 = 10. Я думаю, вы имели в виду, что произведение двух целых чисел является четным, только если оба целых числа нечетные.

David Robbins 10.11.2008 05:37

Произведение является результатом умножения. Сумма является результатом сложения.

Bill the Lizard 10.11.2008 05:38

Вы можете проверить на четность (или нечетность), используя модуль.

i% 2 = 0, если i четное; проверьте это, и вы можете узнать, является ли число четным / нечетным

Свойства, о которых стоит подумать:

  • Нечетные числа не делятся на 2
  • Любое число, умноженное на четное, будет четным

Таким образом, вы можете переформулировать вопрос следующим образом:

Does the array contain at least two integers that are not divisible by 2?

Что должно упростить задачу.

Алгоритм грубой силы:

public static boolean hasAtLeastTwoOdds(int[] args) {
    int[] target = args; // make defensive copy
    int oddsFound;
    int numberOddsSought = 2;

    for (int i = 0; i < target.length; i++) {
        if (target[i] % 2 != 0) {
            if (oddsFound== numberOddsSought) {
                return true;
            }
            oddsFound++;
        }
    }

    return false;
}

Мы ищем нечетные числа, а не четные.

Jon Skeet 10.11.2008 10:05

Вы не инициализируете oddsFound. И вы увеличиваете шансы, найденные ПОСЛЕ проведения теста? Эммм ... в вашем коде есть проблемы.

BoltBait 10.11.2008 22:09

Спасибо за ваши ответы и комментарии.

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

 protected boolean isOdd(int i) {
    return ( (i&1) == 1);

}

С вашей помощью я теперь понимаю, что проблема намного проще, чем я ожидал. Вот остальная часть моей реализации на Java. Комментарии и критика приветствуются.

protected boolean isOddProduct(int[] arr) {
        int oddCount = 0;
        if (arr.length < 2) 
            throw new IllegalArgumentException();
        for (int i = 0; i <= arr.length-1; i++) {
            if (isOdd(arr[i]))
                oddCount++; 
        }
        return oddCount > 1;
    }

Интересно, существуют ли другие способы выполнить этот тест без использования операторов *,% или /? Может, задам этот вопрос в новой ветке.

последний оператор if не нужен, просто верните oddCount> 1; (это моя большая любимая мозоль.

mmattax 10.11.2008 22:22

Кроме того, вы можете написать функцию isOdd просто как «return (i & 1) == 1;» - нет необходимости в операторах return true / false, поскольку у вас уже есть логическое значение из теста.

Greg Beech 11.11.2008 04:54

Спасибо mmattax и Грегу за ваши комментарии - я вернулся и исправил это.

Brian Leahy 17.11.2008 06:17

Другие вопросы по теме