• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2進数の1の数を数える問題)

2進数の1の数を数える問題

このQ&Aのポイント
  • 質問者は、与えられた10進数の整数を2進数に変換し、その中の1の個数を数える問題に取り組んでいます。
  • 自分の解答では、10進数を2で割り続けながら余りを計算し、1の個数を数えるアルゴリズムを使用していますが、正しい結果が得られません。
  • 質問者は、どこが間違っているのかわかりませんので、アドバイスを求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.2

惜しい。これが正解。 #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)
回答No.4

ループ処理に失敗していますね 同様の処理を二箇所に分けているのも感心しません。 あと最近のコンパイラなら自動的に最適化してくれますが、 二進数の処理をするなら、やはりビット演算で書くのが筋でしょう。 // 正解例 ただし入力値が正の整数の場合のみ 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)
回答No.3

みんな、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)
回答No.1

while ループの後に、if(bit) s++; を追加すればいいと思います。

awa3yee
質問者

お礼

 ありがとうございます。

関連するQ&A