Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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

  1. 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 :=

  2. 連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム

    この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を