如果存在一对乘积为奇数的数字,我如何编写一个接受整数数组并返回 true 的函数?
奇数的性质是什么?当然,你如何用 Java 编写这个函数?另外,也许是对您如何为实际实现制定算法的简短解释。
是的,这是教科书中的一个功能。不,这不是家庭作业——我只是想学习,所以请不要“做你自己的家庭作业评论”。
奇数不能被二整除。您只需要知道集合中有两个奇数。只需检查每个数字 mod 2 是否非零。如果是这样,那就奇怪了。如果你找到两个奇数,那么你可以将它们相乘并得到另一个奇数。
注意:奇数乘以偶数总是偶数。
只有当两个整数都是奇数时,两个整数的乘积才会是奇数。所以,要解决这个问题,只需扫描一次数组,看看是否有两个(或更多)奇数。
编辑: 正如其他人所提到的,您可以使用模数 (%) 运算符检查数字是否为奇数。如果 N % 2 == 0,那么这个数是偶数。
值得思考的属性:
因此,您可以将问题重新陈述为:
该数组是否包含至少两个不能被 2 整除的整数?
这应该让事情变得更容易。
您可以使用模数测试均匀性(或奇数)。
i % 2 = 0 如果 i 是偶数;测试一下,你可以找出一个数字是偶数/奇数
蛮力算法:
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;
}
感谢您的回答和评论。
我现在很好地理解了如何测试整数是否为奇数。例如,此方法是一种无需使用乘法、取模或除法运算符的简洁方法:
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;
}
我想知道是否还有其他方法可以在不使用 *、% 或 / 运算符的情况下执行此测试?也许我会在一个新线程中问这个问题。