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

C言語で「1」が連続しないバイナリ文字列の数を数える方法

問題概要

この記事では、長さ n のすべてのバイナリ文字列の中から、「1」が隣り合って現れない文字列の総数を C 言語で求める方法を解説します。

2進数(バイナリ)とは

2進数は数値表現の手法の一つで、デジタルシステムで最も広く利用されています。使用する記号は「0」と「1」の2種類だけで、オン/オフのように動作状態が2つしかないデバイス(例えば「開」か「閉」のどちらかの状態を持つスイッチなど)で自然に表現できるのが特徴です。

そして「バイナリ文字列」とは、0 と 1 のみで構成される文字列のことを指します。

具体例で理解する

入力:n = 2
出力:3
説明:条件を満たすのは「00」「01」「10」の3つだけです。「11」は1が連続しているため除外されます。

入力:n = 7
出力:34

アルゴリズムのアプローチ

この問題は動的計画法(DP)の考え方を使うと効率よく解けます。ポイントは、文字列の末尾が「0」で終わる場合と「1」で終わる場合を分けて数えることです。

  • 文字列の長さ n を入力として受け取ります。
  • count 関数内で、サイズ n の配列 arr[] と arr_2[]、および結果を格納する変数 temp を用意します。
  • arr[i] は「末尾が 0 で終わる長さ i+1 の文字列の数」、arr_2[i] は「末尾が 1 で終わる長さ i+1 の文字列の数」を表します。
  • 初期値として、両配列の 0 番目の要素に 1 を代入します。
  • i = 1 から i < n までループし、arr[i] = arr[i-1] + arr_2[i-1]、arr_2[i] = arr[i-1] を計算します。
  • 最後に temp = arr[n-1] + arr_2[n-1] を求めて出力します。

なお、この漸化式はフィボナッチ数列と同じ構造を持っており、答えはフィボナッチ数 F(n+2) と一致します。

C言語による実装例

#include<stdio.h>
// 1が連続しないバイナリ文字列の数を計算する関数
void count(int num){
    int arr[num];
    int arr_2[num];
    int i = 0, temp = 0;
    arr[0] = arr_2[0] = 1;
    // i が num 未満である間ループ
    for (i = 1; i < num; i++){
        arr[i] = arr[i-1] + arr_2[i-1];
        arr_2[i] = arr[i-1];
    }
    temp = arr[num-1] + arr_2[num-1];
    printf("長さ%dのバイナリ文字列のうち、1が連続しないものの数 : %d\n", num, temp);
}
int main(){
    // count 関数を呼び出す
    count(10);
    count(7);
    count(1);
    return 0;
}

実行結果

長さ10のバイナリ文字列のうち、1が連続しないものの数 : 144
長さ7のバイナリ文字列のうち、1が連続しないものの数 : 34
長さ1のバイナリ文字列のうち、1が連続しないものの数 : 2

まとめ

本プログラムの時間計算量は O(n)、必要なメモリも O(n) と非常に効率的です。「1が連続しないバイナリ文字列の数」はフィボナッチ数列と密接な関係があるため、漸化式の仕組みさえ理解できればシンプルに実装できます。

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

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

  2. Pythonで数値の合計ビット数をカウントするプログラムの作成方法

    まず数値を入力し、bin()関数を使ってその数値を2進数に変換します。次に出力される文字列の先頭2文字「0b」を削除し、最後に2進数文字列の長さを計算することで、合計ビット数を求めることができます。 実行例 入力:200 出力:8 解説 200の2進数表現は 11001000 です(8桁=8ビット) アルゴリズム ステップ1:数値を入力する。 ステップ2:bin()関数を使用して、数値を2進数に変換する。 ステップ3:bin()関数は出力文字列の先頭に「0b」という接頭辞を付加するため、 出力された2進数文字列から最初の2文字「0b」を削除する。 ステップ4:2進