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

【C++】文字列として表現された大きな数同士の乗算を実装する方法


文字列形式で与えられた2つの大きな数値を乗算する方法を解説します。この問題を解く鍵となるのは、「前回の桁同士の乗算結果」と「繰り上がり(carry)」を保持しながら計算を進めるという考え方です。前の桁の乗算結果と繰り上がりを活用することで、次の桁の積を効率的に求めることができます。

まずは具体例を見てみましょう。

入力

15
2

出力

30

アルゴリズム

  • 2つの数値を文字列として初期化します。

  • 長さが「1つ目の数値の長さ + 2つ目の数値の長さ」である結果格納用の文字列を初期化します。

  • 1つ目の数値を末尾から先頭に向かって走査します。

    • 2つ目の数値も末尾から先頭に向かって走査します。

      • 2つの桁を掛け合わせ、対応する位置に既に格納されている値(前回の計算結果)を加算します。

      • その位置の値を新しい結果で更新します。

      • 繰り上がりは、結果文字列の1つ前のインデックスに加算して保存します。

  • 結果の各要素に文字 '0' を加算し、数値を文字に変換します。

  • 先頭の余分なゼロを取り除いた状態で結果を返します。

実装

以下は、上記のアルゴリズムをC++で実装したコードです。

#include <bits/stdc++.h>
using namespace std;
string multiplyTwoNumbers(string num1, string num2) {
   if (num1 == "0" || num2 == "0") {
      return "0";
   }
   string product(num1.size() + num2.size(), 0);
   for (int i = num1.size() - 1; i >= 0; i--) {
      for (int j = num2.size() - 1; j >= 0; j--) {
            int n = (num1[i] - '0') * (num2[j] - '0') + product[i + j + 1];
            product[i + j + 1] = n % 10;
            product[i + j] += n / 10;
      }
   }
   for (int i = 0; i < product.size(); i++) {
      product[i] += '0';
   }
   if (product[0] == '0') {
      return product.substr(1);
   }
   return product;
}
int main() {
   string num1 = "34";
   string num2 = "57";
   if((num1.at(0) == '-' || num2.at(0) == '-') && (num1.at(0) != '-' || num2.at(0) != '-')) {
      cout << "-";
   }
   if(num1.at(0) == '-') {
      num1 = num1.substr(1);
   }
   if(num2.at(0) == '-') {
      num2 = num2.substr(1);
   }
   cout << multiplyTwoNumbers(num1, num2) << endl;
   return 0;
}

出力

上記のコードを実行すると、次の結果が得られます。

1938

  1. 2進数同士の乗算を最速で行う方法 ― 分割統治法による効率的なアルゴリズム

    2つの数が2進数(バイナリ)の文字列として与えられたとき、それらの積をいかに速く、効率的に求めるか。本記事ではその手法を詳しく解説します。 この問題は分割統治法(Divide and Conquer)を用いることで、非常に高い効率で解決できます。基本的なアイデアは、それぞれの数を前半と後半の2つの部分に分割し、部分ごとの結果を組み合わせて全体の積を得ることです。 ここで、最初の数 X を Xleft と Xright に、2番目の数 Y を Yleft と Yright に分割すると、積は次のように表されます。 さらに計算をシンプルにするため、上式は次のように変形できます。 この手法は

  2. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ