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

n個のバイナリ文字列の合計を求める方法|C++での2進数加算の実装例

n個のバイナリ文字列を加算するとは?

このプログラムでは、与えられた複数のバイナリ(2進数)文字列をすべて加算します。入力としてn個のバイナリ文字列が渡され、それらを合計した結果を1つのバイナリ文字列として出力するのが目的です。

処理には通常の2進数加算のロジックを利用し、1つ目の文字列からn個目までを順番に足し合わせていくことで、最終的な結果を求めます。

入出力例

Input: "1011", "10", "1001"
Output: 10110

解説:2進数のまま加算するアプローチ

もっとも簡単な方法は、バイナリ文字列を一度10進数に変換してから加算し、その結果を再び2進数に戻すことです。しかし、ここでは変換を介さずに、2進数のまま直接加算を行う方法を紹介します。

まず、2つのバイナリ文字列を加算するためのヘルパー関数を用意します。そして、この関数をn個のバイナリ文字列に対してn-1回呼び出すことで、全体の合計を計算できます。

2進数同士の加算は、以下の手順で行います。

  • 両方の文字列の末尾(最下位ビット)から順に桁を読み取る
  • 各桁の値と繰り上がり(キャリー)を合計し、2で割った余りを結果の桁とする
  • 2で割った商を次の桁の繰り上がりとして保持する
  • どちらかの文字列に残りがある間、または繰り上がりが残っている間は処理を継続する

C++による実装例

以下は、上記のロジックをC++で実装したサンプルコードです。

#include<iostream>
using namespace std;

// 2つのバイナリ文字列を加算するヘルパー関数
string add(string b1, string b2) {
   string res = "";
   int s = 0; // 桁ごとの合計(繰り上がりを含む)
   int i = b1.length() - 1, j = b2.length() - 1;
   while (i >= 0 || j >= 0 || s == 1) {
      if(i >= 0) {
         s += b1[i] - '0';
      } else {
         s += 0;
      }
      if(j >= 0) {
         s += b2[j] - '0';
      } else {
         s += 0;
      }
      res = char(s % 2 + '0') + res;
      s /= 2; // 繰り上がりを更新
      i--; j--;
   }
   return res;
}

// n個のバイナリ文字列を順に加算する関数
string addbinary(string a[], int n) {
   string res = "";
   for (int i = 0; i < n; i++) {
      res = add(res, a[i]);
   }
   return res;
}

int main() {
   string arr[] = { "1011", "10", "1001" };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << addbinary(arr, n) << endl;
}

コードのポイント

  • add関数:末尾から1桁ずつ読み取り、繰り上がりを管理しながら結果を先頭に追加していくシンプルな2進数加算の実装です。
  • addbinary関数:初期値として空文字列を用意し、配列内のバイナリ文字列を1つずつ累積的に加算していきます。

まとめ

この手法の大きなメリットは、10進数への変換を行わないため、整数型の範囲を超えるような非常に長いバイナリ文字列でもオーバーフローを気にせず扱える点です。各文字列の最大長をLとすると、計算量はおおむね O(n × L) となり、効率的に動作します。ビット演算や文字列操作の基礎を学ぶ題材としても最適なので、ぜひ自分のコードでも試してみてください。

  1. C#で二分探索(バイナリサーチ)を実装する方法|仕組みと計算量を解説

    二分探索とは二分探索(バイナリサーチ)は、ソート済みの配列を対象とした高速な検索アルゴリズムです。探索したい値を配列の中央にある要素と比較し、一致しなかった場合は、その値が存在し得ない側の半分の領域を丸ごと除外します。この操作を残りの半分に対して繰り返すことで、効率よく目的の値を見つけ出します。例えば、下図のような配列から「62」という値を探す場合を考えてみましょう。中央の要素との比較結果から、62が存在するのは右側の領域だけであることが分かるため、左半分は完全に除外され、以降は右半分のみが探索対象となります。二分探索の計算量二分探索における各ケースの計算量は以下の通りです。最悪時間計算量O(

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

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