C++で文字列として表される大きな数を乗算する
文字列形式で2つの数値を指定します。それらを掛ける必要があります。この問題を解決するためのアイデアは、前の桁の乗算の答えとキャリーを維持することです。前の桁の乗算の答えとキャリーを使用して、次のセットの桁の乗算を取得できます。
例を見てみましょう。
入力
15 2
出力
30
アルゴリズム
-
文字列で数値を初期化します。
-
長さnumber_one_length+number_two_lengthの文字列を初期化します。
-
最後から最初の番号を繰り返します。
-
最後から2番目の数字を繰り返します。
-
2桁を乗算し、対応する前の行の桁を追加します。
-
前の行の数字を更新します。
-
結果文字列の前のインデックスにキャリーを格納します。
-
-
-
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
-
2つの数を掛ける最速の方法
2つの数値は2進文字列として指定されます。私たちのタスクは、これらの数値の乗算の結果をより高速かつ効率的に見つけることです。 分割統治法を使用すると、非常に効率的な方法で問題を解決できます。数字を2つに分割します。 XleftとXrightが最初の数Xの2つの部分であり、Yleft、Yrightが2番目の数Yの2つの部分であるとします。したがって、製品; 簡単にするために、この操作を実行できます 入力と出力 Input: Two binary numbers: 1101 and 0111 Output: The result is: 91 アルゴリズム addBi
-
数値がC++で2つの三角数の合計として表現できるかどうかを確認します
このセクションでは、1つの数を2つの三角数の合計として表現できるかどうかを確認します。三角数は以下のようになります- 例から、1、3、6、10はいくつかの三角数であることがわかります。数N(たとえば16)を2つの三角数(6、10)の合計として表す必要があります。 アプローチは非常に簡単です。 N未満のすべての三角数を取得する必要があります。これらの値からセットを作成します。ここで、集合からXと言う数を取り、N – Xが集合に存在するかどうかを確認する必要があります。そうすると、Xは2つの三角数の合計として表すことができます。 例 #include <iostream> #