C++で2つの大きな数の合計を求める方法
この問題では、2つの大きな数を表す文字列が与えられます。私たちのタスクは、これら2つの大きな数の合計を求めるプログラムを作成することです。
大きな数は int や long long などの標準の整数型では表現できないほど大きくなるため、数値を文字列として受け取り、桁ごとに演算を行う手法が有効です。
問題を理解するための例
入力: number1 = "341299123919" number2 = "52413424" 出力: 341351537343
解決のアプローチ
この問題を解くには、両方の文字列を1の位(末尾)から先頭に向かって走査します。各桁を1桁ずつ加算し、合計が10を超えた分は繰り上がり(carry)として次の桁へ伝播させます。計算結果の各桁は、合計を格納する文字列に順次追加していきます。
アルゴリズム
sum = ""、carry = 0 で初期化する。 ステップ1: 短い方の数の末尾から先頭に向かってループする。 ステップ1.1: intSum = number1[i] + number2[i] + carry(数値として計算) ステップ1.2: carry = intSum / 10 とし、sum に intSum % 10 を追加する。 ステップ2: 長い方の数の残りの桁に対して同じ処理を繰り返す。 ステップ3: 最後に繰り上がりが残っていれば sum に追加する。 ステップ4: sum を反転して返す。
実装例
このソリューションの動作を示すプログラムは以下のとおりです。
#include<bits/stdc++.h>
using namespace std;
string addBigNumbers(string number1, string number2) {
if (number1.length() > number2.length())
swap(number1, number2);
string sum = "";
int len1 = number1.length();
int len2 = number2.length();
int digitDiff = len2 - len1;
int carry = 0;
int intSum;
for (int i = len1 - 1; i >= 0; i--) {
intSum = ((number1[i]-'0') + (number2[i+digitDiff]-'0') + carry);
sum.push_back(intSum%10 + '0');
carry = intSum/10;
}
for (int i = digitDiff - 1; i >= 0; i--) {
intSum = ((number2[i]-'0') + carry);
sum.push_back(intSum%10 + '0');
carry = intSum/10;
}
if (carry)
sum.push_back(carry+'0');
reverse(sum.begin(), sum.end());
return sum;
}
int main() {
string number1 = "235235823852";
string number2 = "45230820348";
cout<<"Sum of two large numbers is "<<addBigNumbers(number1, number2);
return 0;
}出力
Sum of two large numbers is 280466644200
このように、文字列として与えられた大きな数でも、桁ごとの加算と繰り上がりの管理を適切に行うことで、標準の整数型の制限を受けずに正確な合計を求めることができます。各桁を1回ずつ処理するため、計算量は O(max(len1, len2)) となり、非常に効率的です。
-
C++でN未満の2つの数の倍数の合計を求める方法
問題概要 この問題では、3つの整数 M1、M2、N が与えられます。求めるのは、N 未満に存在する M1 と M2 の倍数をすべて足し合わせた合計値です。 つまり、N 未満の数のうち、M1 または M2 の倍数に該当するものをすべて加算します。 問題を理解するための例 入力: N = 13, M1 = 4, M2 = 6 出力: 30 解説: 13 未満で 4 または 6 の倍数となる数は「4, 6, 8, 12」です。したがって合計は 4 + 6 + 8 + 12 = 30 となります。 解法1:シンプルな全探索アプローチ 最も基本的な解決策は、1 から N 未満まで順にループ処理を行い、M
-
C++で解くTwo Sum IV ― 二分探索木(BST)が入力の場合
問題概要 二分探索木(BST)とターゲット値が1つ与えられます。このとき、BST内に「2つの要素の和がターゲット値と等しくなる」ような組み合わせが存在するかどうかを判定するのが本問題です。 例えば、次のような木が入力として与えられた場合を考えてみましょう。 この場合、出力は True(真)となります。 解法のアプローチ この問題は、BSTを中間順(inorder)走査して昇順の配列を作り、その後「双方向ポインタ(two pointer)」を使うことで効率的に解けます。具体的には、以下の手順に従います。 値を格納するための配列 v を定義します。 関数 inorder() を定義します(引