【问题标题】:How to test if an array contains a pair of numbers whose product is odd?如何测试一个数组是否包含一对乘积为奇数的数字?
【发布时间】:2008-11-10 02:26:14
【问题描述】:

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

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

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

【问题讨论】:

  • 也许我们也可以将诸如“任务”之类的问题标记为?
  • 也许将他们标记为“学习”而不是“家庭作业”?
  • 是的,这是个好主意。 “任务”可能与“家庭作业”混淆。 “学习”不是那么模糊
  • 用“学习”替换“功能”标签
  • 如果我想在作业上寻求帮助,我会确保说我不是在寻求作业上的帮助...

标签: java algorithm integer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 7 + 3 = 10。我认为你的意思是两个整数的乘积只有当两个整数都是奇数时才是偶数。
    • 乘积是乘法的结果。和是加法的结果。
    【解决方案3】:

    值得思考的属性:

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

    所以你可以将问题重新陈述为:

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

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

    【讨论】:

      【解决方案4】:

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

      i % 2 = 0 如果 i 是偶数;对此进行测试,您可以找出一个数字是偶数/奇数

      【讨论】:

        【解决方案5】:

        蛮力算法:

        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。而且,你在做测试后增加了oddsFound?嗯...您的代码有问题。
        【解决方案6】:

        感谢您的回答和cmets。

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

         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;” - 不需要返回真/假语句,因为您已经从测试中获得了布尔值。
        • 感谢 mmattax 和 Greg 提供的 cmets——我回去修复了这个问题。
        猜你喜欢
        • 2018-04-20
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        相关资源
        最近更新 更多