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