- ベストアンサー
2進数の1の数を数える問題
- 質問者は、与えられた10進数の整数を2進数に変換し、その中の1の個数を数える問題に取り組んでいます。
- 自分の解答では、10進数を2で割り続けながら余りを計算し、1の個数を数えるアルゴリズムを使用していますが、正しい結果が得られません。
- 質問者は、どこが間違っているのかわかりませんので、アドバイスを求めています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
惜しい。これが正解。 #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □ □s = 0; □while(n) { □□printf("%d/2=%d・・・余り%d\n",n,n/2,n%2); □□bit = n % 2; □□n /= 2; □□if (bit) □□□s++; □} □printf("%d", s); □return EXIT_SUCCESS; } ヒントとして途中経過を表示しているから考えてみてください。
その他の回答 (3)
- Ogre7077
- ベストアンサー率65% (170/258)
ループ処理に失敗していますね 同様の処理を二箇所に分けているのも感心しません。 あと最近のコンパイラなら自動的に最適化してくれますが、 二進数の処理をするなら、やはりビット演算で書くのが筋でしょう。 // 正解例 ただし入力値が正の整数の場合のみ int s, b; for (s = 0, b = 入力値; b != 0; b >>= 1) { □ if(b & 1 > 0) s++; } printf("%d is %d\n", 入力値, s); -- 出題の例からは外れますが、別解として // K&R に登場する高速化した処理 int s, b; for (s = 0, b = 入力値; b != 0; s++) { □ b &= b - 1; } printf("%d is %d\n", 入力値, s); // 分割統治法を用いた実用的な処理 unsigned int t = 入力値; t -= (t >> 1) & 0x55555555; t = (t & 0x33333333) + ((t >> 2) & 0x33333333); t = (t + (t >> 4)) & 0x0f0f0f0f; t += t >> 8; t += t >> 16; t &= 0x3f; printf("%d is %d\n", 入力値, t);
- LunaSun
- ベストアンサー率30% (4/13)
みんな、do~whileを忘れないであげてね。 #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □s = 0; □do { □□s += n % 2; □} while ((n /= 2)); □printf("%d\n", s); □return EXIT_SUCCESS; }
- dolittle0
- ベストアンサー率26% (11/42)
while ループの後に、if(bit) s++; を追加すればいいと思います。
お礼
ありがとうございます。