私は元のコード、アンチコードおよび補体下コンセプトについてお話しましょう。正または負の数の最初のコンピュータで0の正の数、負の数を示します。3ヤードのすべての条件が同じ数。負の数の場合、この3ヤードは、その符号には影響しません。すべてのビットへのアンチコード、プラス1に反転補完。
ここで読み出さトピック入力に番号を考えているN、サイクル数をkによって決定され、k番目のように見つけること> n = 2の場合、決意は、それらが等しい場合に等しくない場合、出力1に等しく、かつnを算出します2 K-1との差をパワーSIGと呼ばれ、出力は1つの+ F(SIG)として得られ、以下のように、コードは次のとおりです。
1の#include <iostreamの> 2の#include <ベクトル> 3の#include <math.h>の 4 使って 名前空間STDを、 5 クラスソリューション{ 6 公共: 7 INT NumberOf1(INT N){ 8 のint i = 0 ; 9 一方(POW(2、i)は< N) 10 { 11 I ++ 。 12 } 13 であれば(POW(2、i)は== N) 14 { 15 リターン 1 。 16 } 17 他{ 18 INT SIG = N - POW(2、I - 1 )。 19 int型の再; 20 再= 1 + NumberOf1(SIG)。 21の 戻り再; 22 } 23 24 } 25 }。 26 のint main()の 27 { 28 ソリューションので、 29 INT再= so.NumberOf1(20 )。 30 coutの<< <<再てendlを。 31 リターン 0 ; 32 }
私自身のテスト結果が正しいか、結果がemmmmmmm、その残業を与えられている......
次に、これは答えの変更に基づいて良い感じている単純な答えを見て:
1 クラスソリューション{ 2 公共: 3 INT NumberOf1(int型n)を{ 4 INT I = 1、=カウント0 。 5 しばらく(N) 6 { 7 場合(I&N) 8 { 9 カウント++ 。 10 } 11 N = N >> 1 。 12 } 13 リターン数えます。 14 15 } 16 }。
しかし、ガチョウ、または時間外......
私は少し良く変更しましたが、私は、問題を見つけられませんでした....... この質問は関係なく、正と負の、あまり考えていない、という事実にあります。オンラインプログラミングスパイシーなチキン牛の顧客ネットワークについてTucao。私は実際に渡されたVC ++のコードでは動作しませんデバッグしています。
1 クラスソリューション{ 2 公共: 3 INT NumberOf1(int型N) 4 { 5 int型のカウント= 0 ; 6 のintフラグ= 1 。 7 一方(フラグ) 8 { 9 あれば(N&フラグ) 10 { 11 カウント++ 。 12 } 13 フラグ=フラグ<< 1 。 14 } 15 リターンカウント; 16 } 17 }。
ちょうどnに、本当に超シンプルなアイデアで、n-1と算術演算を行う答えを読んで、あなたは最後の1サイクルの終わりを解消するまで、これはそれでなければならないので、上の図の右端を排除し、することができます質問の最適解:
1つの 公共: 2 INT NumberOf1(INT N) 3 { 4 int型のカウント= 0 ; 5 しばらく(N) 6 { 7 カウント++ 。 8 N = N・(N - 1 )。 9 } 10 リターン数えます。 11 }
STLは、直接関数をするために使用することができている、私はそれを覚えている......
1 クラスソリューション{ 2 公共: 3 INT NumberOf1(INT N) 4 { 5 ビット集合< 32 > ビット(N)。 6 戻りbit.count()。 7 8 }