C言語で2進数の末尾・先頭のゼロの個数をカウントするプログラム
まずは、2進数における「末尾のゼロ(トレーリングゼロ)」とは何かを理解しましょう。
末尾のゼロ(Trailing Zeros)とは
2進数において、最下位ビット(LSB)側から見て最初に現れる「1」より後ろに続くゼロのことを、末尾のゼロと呼びます。
例
10進数の104を例に考えてみます。
104を2進数に変換すると:(MSB)1101000(LSB)
ここで、
- MSBとは最上位ビット(Most Significant Bit)のことです。
- LSBとは最下位ビット(Least Significant Bit)のことです。
- LSB側から見て最初に「1」が立っているビットより後ろには、ゼロが3つ並んでいます。
- したがって、この数の末尾のゼロは3個です。
末尾のゼロをカウントするプログラム
以下は、入力された数値について、末尾のゼロの個数をカウントするC言語プログラムです。数値を右シフトしながら各ビットを調べ、「1」が現れた時点でループを抜ける仕組みになっています。
#include<stdio.h>
#include<stdlib.h>
int main(){
int number, i, trail = 0, size;
printf("Enter a number\n");
scanf("%d",&number);
size = sizeof(number) * 8;
for(i = 0; i < size; i++){
if((number >> i) & 1) {
break;
}
trail++;
}
printf("Number of trailing ZERO is = %d", trail);
return 0;
}
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
Enter a number 24 Number of trailing ZERO is = 3
入力した24は2進数で「11000」となるため、末尾のゼロが3個であることが確認できます。
先頭のゼロ(Leading Zeros)とは
逆に、最上位ビット側から見て最初に「1」が立つビットよりも前にあるゼロのことを、先頭のゼロと呼びます。
例
10進数の94を例にします。
94を2進数(32ビット整数)で表すと:(MSB).....001011110(LSB)
この場合、先頭のゼロの個数は25個になります。
先頭のゼロをカウントするプログラム
以下は、入力された数値について、先頭のゼロの個数をカウントするC言語プログラムです。最上位ビットを示すマスクを作成し、数値を左シフトさせながらチェックすることで、「1」が最初に現れる位置を検出しています。
#include<stdio.h>
#include<stdlib.h>
int main(){
int number, i, lead = 0, Msb,size;
printf("Enter a number\n");
scanf("%d",&number);
size = sizeof(number) * 8;
Msb=1<<(size-1);
for(i = 0; i < size; i++){
if((number << i) & Msb) {
break;
}
lead++;
}
printf("Number of Leading ZERO is = %d", lead);
return 0;
}
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
Enter a number 94 Number of Leading ZERO is = 25
-
Pythonで1からkまでのすべての数で割り切れる最小の整数xの末尾ゼロの個数を求めるプログラム
問題の概要ある数 k が与えられたとき、1 から k までのすべての整数で割り切れる最小の正整数 x を考えます。つまり、x が 1 から k までのすべての数の倍数となるような最小の値です。この x の末尾に連続して並ぶゼロ(後続ゼロ)の個数を求めるのが課題です。例えば、入力が k = 6 の場合を考えてみましょう。このとき条件を満たす最小の x は 60 です。60 は 1、2、3、4、5、6 のすべてで割り切ることができます。そして 60 の末尾にはゼロが 1 個あるため、出力は 1 となります。解決のためのアプローチこの問題は、次の手順で解くことができます。res := 0、x :=
-
連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム
この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を