1

如果存在一对乘积为奇数的数字,我如何编写一个接受整数数组并返回 true 的函数?

奇数的性质是什么?当然,你如何用 Java 编写这个函数?另外,也许是对您如何为实际实现制定算法的简短解释。

是的,这是教科书中的一个功能。不,这不是家庭作业——我只是想学习,所以请不要“做你自己的家庭作业评论”。

4

6 回答 6

15

奇数不能被二整除。您只需要知道集合中有两个奇数。只需检查每个数字 mod 2 是否非零。如果是这样,那就奇怪了。如果你找到两个奇数,那么你可以将它们相乘并得到另一个奇数。

注意:奇数乘以偶数总是偶数。

于 2008-11-10T02:30:27.890 回答
6

只有当两个整数都是奇数时,两个整数的乘积才会是奇数。所以,要解决这个问题,只需扫描一次数组,看看是否有两个(或更多)奇数。

编辑: 正如其他人所提到的,您可以使用模数 (%) 运算符检查数字是否为奇数。如果 N % 2 == 0,那么这个数是偶数。

于 2008-11-10T02:30:39.280 回答
3

值得思考的属性:

  • 奇数不能被 2 整除
  • 任何数乘以偶数都是偶数

因此,您可以将问题重新陈述为:

该数组是否包含至少两个不能被 2 整除的整数?

这应该让事情变得更容易。

于 2008-11-10T02:32:58.213 回答
0

您可以使用模数测试均匀性(或奇数)。

i % 2 = 0 如果 i 是偶数;测试一下,你可以找出一个数字是偶数/奇数

于 2008-11-10T02:32:37.263 回答
0

蛮力算法:

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;
}
于 2008-11-10T04:18:30.497 回答
0

感谢您的回答和评论。

我现在很好地理解了如何测试整数是否为奇数。例如,此方法是一种无需使用乘法、取模或除法运算符的简洁方法:

 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;
    }

我想知道是否还有其他方法可以在不使用 *、% 或 / 运算符的情况下执行此测试?也许我会在一个新线程中问这个问题。

于 2008-11-10T19:04:24.280 回答