Как я могу написать функцию, которая принимает массив целых чисел и возвращает истину, если существует пара чисел, произведение которых нечетно?
Каковы свойства нечетных целых чисел? И, конечно, как написать эту функцию на Java? Также, может быть, краткое объяснение того, как вы формулировали алгоритм для фактической реализации.
Да, это функция из учебника. Нет, это не домашнее задание - я просто пытаюсь учиться, поэтому, пожалуйста, не делайте своих собственных комментариев по домашнему заданию.
Может быть, пометьте их словом «обучение» вместо «домашнее задание»?
да, это хорошая идея. «задание» можно спутать с «домашним заданием». «обучение» не так уж и неоднозначно
заменил тег "функция" на "обучение"
Если бы я пытался получить помощь с домашней работой, я обязательно сказал бы, что не пытался получить помощь с моей домашней работой ...




Нечетное число не делится на два без остатка. Все, что вам нужно знать, это два нечетных числа в наборе. Просто проверьте, не является ли каждое число по модулю 2 отличным от нуля. Если так, то это странно. Если вы найдете два нечетных числа, вы можете умножить их и получить еще одно нечетное число.
Примечание: нечетное число, умноженное на четное, всегда получается четным.
Произведение двух целых чисел будет нечетным Только, если оба целых числа нечетные. Итак, чтобы решить эту проблему, просто просканируйте массив один раз и посмотрите, есть ли два (или более) нечетных целых числа.
Обновлено: Как уже упоминалось, вы проверяете, является ли число нечетным, используя оператор модуля (%). Если N% 2 == 0, то число четное.
7 + 3 = 10. Я думаю, вы имели в виду, что произведение двух целых чисел является четным, только если оба целых числа нечетные.
Произведение является результатом умножения. Сумма является результатом сложения.
Вы можете проверить на четность (или нечетность), используя модуль.
i% 2 = 0, если i четное; проверьте это, и вы можете узнать, является ли число четным / нечетным
Свойства, о которых стоит подумать:
Таким образом, вы можете переформулировать вопрос следующим образом:
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;
}
Мы ищем нечетные числа, а не четные.
Вы не инициализируете oddsFound. И вы увеличиваете шансы, найденные ПОСЛЕ проведения теста? Эммм ... в вашем коде есть проблемы.
Спасибо за ваши ответы и комментарии.
Теперь я хорошо понимаю, как проверить, является ли целое число нечетным. Например, этот метод - изящный способ выполнить этот тест без использования операторов умножения, модуля или деления:
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; (это моя большая любимая мозоль.
Кроме того, вы можете написать функцию isOdd просто как «return (i & 1) == 1;» - нет необходимости в операторах return true / false, поскольку у вас уже есть логическое значение из теста.
Спасибо mmattax и Грегу за ваши комментарии - я вернулся и исправил это.
может, такие вопросы тоже можно пометить как «задача»?