数値は、バイナリ展開内に奇数の 1 がある場合、奇数とみなされます。最初の 10 個の奇数は、1、2、4、7、10、11、13、14、16、19、21 です。興味深いことに、2 のべき乗はすべて 1 ビットしか設定されていないため、奇数になります。
次の記事では、数字が嫌な数字かどうかを判断する 2 つの方法について詳しく説明します。
###問題文###不快なデジタル例
リーリー リーリー桁数 = 2 を設定します。
1 の数は偶数なので、34 という数字はそれほどひどい数字ではありません。
リーリー リーリーイラスト
桁数 = 1 を設定します。
1024 は 2 の累乗なので、設定ビットは 1 つだけです。ということで、恐ろしい数字です。
リーリー リーリーイラスト
= (110101)2 桁数 = 4 を設定します。
したがって、これは忌まわしい数字ではありません。
###解決###ある数字がヘイトかどうかを判断するには、設定された桁数が奇数か偶数かを知る必要があります。ここでの主なタスクは、数値の 2 進展開で設定された桁数をカウントすることです。次の手法を使用して、桁数を数え、結果が奇数であるか偶数であるかを確認できます。
素朴なアプローチ
ビット値が 1 の場合、カウントを 1 つ増やします。
count の最終値が奇数か偶数かを確認します。
答えを表示します。
疑似コード
初期化回数 = 0
(n > 0)の場合
関数は_odious()
If (カウントが奇数)
trueを返す
######他の######
関数 main()
初期化 n
関数呼び出し no_of_set_bits()
関数 is_odious()を呼び出します
印刷出力
例: C プログラム
時間と空間の分析
このアルゴリズムを使用すると、数値の設定された桁数をより効率的な方法で計算できます。その後、関数 is_odious() を使用して、その番号が不快なものかどうかを判断できます。 このメソッドの基本原理は、ゼロに達するまでに必要な反復回数を追跡しながら、数値の右端の設定ビットを繰り返しクリアすることです。必要な手順は -
です。カウントを 0 に初期化します
数値が 0 より大きい場合、数値と 2 の補数の間でビット単位の & を実行して、右端の設定ビットの設定を解除します。
######結果を示す。
数値が 10 であるとします。10 を 2 進展開すると 1010 になります。 2 つの設定ビットがあることがわかります。
関数 no_of_set_bits()
初期化回数 = 0
(n > 0)の場合
カウントを増やす
前の方法と同じ
このプログラムは、すべてのビットの設定を解除するのに必要な反復回数を数えることによって、設定されたビットの数を計算します。ビットをキャンセルするには、n と n-1 に対してビット単位の AND 演算を実行します。これは、n-1 のバイナリ表現により、n の右端の設定ビットとそれに続くすべてのビットが反転されるためです。 リーリー ###出力### リーリー
時空分析スペースの複雑さ
- 余分なスペースが使用されないため、O(1)。最初のアプローチは非常に理解しやすいですが、最終結果を生成するには log(n) 回の反復が必要です。一方、2 番目の方法では、log(x) 反復を使用します。ここで、x は数値の 2 進展開で設定された桁数です。したがって、パフォーマンスが向上します。
###結論は###以上が忌まわしい数字の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。