整数の配列を取り、その積が奇数の数値のペアが存在する場合に true を返す関数を作成するにはどうすればよいですか?
奇数の性質は何ですか? そしてもちろん、この関数を Java でどのように記述しますか? また、実際の実装のためのアルゴリズムの定式化にどのように取り組んだかについての簡単な説明かもしれません.
はい、これは教科書に載っていない関数です。いいえ、これは宿題ではありません。ただ学ぼうとしているだけなので、「自分で宿題のコメントをする」のはやめてください。
奇数は 2 で割り切れません。知っておく必要があるのは、セットに 2 つの奇数があるかどうかだけです。各数値 mod 2 がゼロでないかどうかを確認するだけです。もしそうなら、それは奇妙です。2 つの奇数が見つかった場合は、それらを乗算して別の奇数を取得できます。
注: 奇数に偶数を掛けたものは常に偶数です。
2 つの整数の積が奇数になるのは、両方の整数が奇数の場合だけです。したがって、この問題を解決するには、配列を 1 回スキャンして、2 つ (またはそれ以上) の奇数の整数があるかどうかを確認します。
編集: 他の人が述べたように、モジュラス (%) 演算子を使用して数値が奇数かどうかを確認します。N % 2 == 0 の場合、数値は偶数です。
検討する価値のあるプロパティ:
したがって、質問を次のように言い換えることができます。
配列には、2 で割り切れない整数が少なくとも 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;
}
回答とコメントありがとうございます。
整数が奇数かどうかをテストする方法がよくわかりました。たとえば、次の方法は、乗算、剰余、または除算演算子を使用せずにこのテストを実行するための優れた方法です。
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;
}
*、%、または / 演算子を使用せずにこのテストを実行する方法が他にあるのでしょうか? 多分私は新しいスレッドでこの質問をします。
モジュラスを使用して、偶数 (または奇数) をテストできます。
i % 2 = i が偶数の場合は 0。それをテストすると、数値が偶数か奇数かがわかります