整数のセットビットをカウントするC/C++プログラム
セットビットのカウントとは
セットビットのカウントとは、与えられた整数を2進数で表現したときに含まれる「1」の個数を数えることを意味します。これを実現する方法はいくつかありますが、ここでは整数のバイナリ表現を対象に、各ビットを走査して1の数を数える基本的な手法を紹介します。
たとえば、入力として17を与えた場合、17の2進表現は「10001」であり、1が2つ含まれるため、出力は2になります。
入力:正の整数を入力してください:6 出力:2
アルゴリズムの解説
6の2進表現は「110」であり、セットビット(1になっているビット)は2つ存在します。
この反復的なアプローチでは、1ビットにつき1回の反復が必要になります。数値のすべてのビットを順番に調べていき、セットされているビットがなくなった時点で反復を終了します。最悪の場合、最上位ビットだけが立っている32ビットの数値では、32回のループが発生します。この解決策は最もシンプルで、1のビットがまばらに存在し、下位ビット側に集中している場合に特に有効です。
処理の流れ
- カウンタ変数を0で初期化します。
- 数値が0になるまで、以下の操作を繰り返します。
- 「n & 1」で最下位ビットが1かどうかを判定し、1であればカウンタを増加させます。
- 「n >>= 1」で数値を1ビット右シフトし、次のビットへ移動します。
サンプルコード
#include <stdio.h>
int main(void) {
unsigned int n = 34;
int c;
for (c = 0; n; n >>= 1) {
c += n & 1;
}
printf("%d\n", c);
return 0;
}このプログラムでは、n = 34(2進表現は「100010」)としているため、実行すると「2」が出力されます。変数cは1の個数を格納するカウンタであり、ループのたびに最下位ビットを判定しながら右シフトを繰り返すことで、すべてのビットを効率的に走査できます。
-
マージソートを使って配列の転倒数(反転数)を数えるC/C++プログラム
転倒数(Inversion Count)とは?与えられた配列をソートする際に発生する反転(転倒)の回数を「転倒数(Inversion Count)」と呼びます。転倒数を求める問題は古典的なアルゴリズム問題の一つで、マージソート(Merge Sort)のアルゴリズムを応用することで効率的に解くことができます。この問題では、各要素について「自分より左側にあり、かつ自分より大きな値を持つ要素」の数をすべて数え上げ、その合計を出力します。この処理は、マージソートのマージ(merge)関数の中で実装されます。理解を深めるために、マージ処理で扱う2つの部分配列を例に考えてみましょう。配列の転倒数の定義配列
-
三角マッチ棒数を求めるC/C++プログラムの解説と実装例
三角マッチ棒数とはマッチ棒を正三角形の形に並べて作った三角形のことを「三角マッチ棒数(Triangular Matchstick Number)」と呼びます。三角マッチ棒数とは、そのマッチ棒の三角形を作るために必要なマッチ棒の本数を指します。問題の概要この問題では、マッチ棒で作るピラミッドの段数 X が与えられます。そして、X 段のマッチ棒ピラミッドを構成するために必要なマッチ棒の最小総本数を出力するプログラムを作成するのが課題です。概念をより明確にするために、具体例を見てみましょう。入力: 7 出力: 84解法の考え方この問題は、三角数(Triangular Number)の拡張として考える