C++で+演算子をオーバーロードして2つの複素数を加算する方法
実部(real)と虚部(imag)を持つ複素数クラスがあるとします。このクラスに対して、2つの複素数を加算できるように、加算演算子「+」をオーバーロードする必要があります。あわせて、複素数を見やすい形式の文字列として返す関数も定義しておくと便利です。
たとえば、入力が c1 = 8 - 5i、c2 = 2 + 3i の場合、期待される出力は 10 - 2i となります。
解決の手順
- 「+」演算子をオーバーロードし、引数としてもう一つの複素数 c2 を受け取るようにします
- 実部・虚部がともに0である複素数 ret を定義します
- ret の実部 := 自身の実部 + c2 の実部
- ret の虚部 := 自身の虚部 + c2 の虚部
- ret を返します
サンプルコード
以下の実装例を見ると、より理解しやすくなります。
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
class Complex {
private:
int real, imag;
public:
Complex(){
real = imag = 0;
}
Complex (int r, int i){
real = r;
imag = i;
}
string to_string(){
stringstream ss;
if(imag >= 0)
ss << "(" << real << " + " << imag << "i)";
else
ss << "(" << real << " - " << abs(imag) << "i)";
return ss.str();
}
Complex operator+(Complex c2){
Complex ret;
ret.real = real + c2.real;
ret.imag = imag + c2.imag;
return ret;
}
};
int main(){
Complex c1(8,-5), c2(2,3);
Complex res = c1 + c2;
cout << res.to_string();
}入力
c1(8,-5), c2(2,3)
出力
(10 - 2i)
解説
このプログラムでは、operator+ をメンバ関数としてクラス内に定義することで、「+」演算子を複素数同士の加算に対応させています。左辺のオブジェクト自身の実部・虚部と、引数で渡された右辺のオブジェクト c2 の実部・虚部をそれぞれ足し合わせた新しい Complex オブジェクトを生成して返すのがポイントです。
また、to_string() 関数では stringstream を使って結果を「(10 - 2i)」のような数式表現に整形しています。虚部が負の場合は abs 関数で絶対値を取り、マイナス記号付きの形式で表示するように処理を分けています。
このように演算子オーバーロードを活用すると、c1 + c2 という直感的な記述で複素数の加算が行えるため、コードの可読性が大幅に向上します。
-
C++で2つの2進数文字列を加算するプログラムの書き方
2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁
-
【Java入門】2つの複素数を加算するプログラムの作り方を解説
この記事では、Javaを使って2つの複素数を加算する方法を解説します。複素数は「i」で表される虚部を持つ数値のため、実部と虚部をそれぞれ別々に計理する必要があります。 複素数の加算の基本 複素数は一般的に「a + bi」という形で表されます。ここで「a」が実部、「b」が虚部です。2つの複素数を足し合わせる場合は、以下のように実部同士・虚部同士をそれぞれ加算します。 (a + bi) + (c + di) = (a + c) + (b + d)i 入力と出力の例 入力: 15 + i24 と 3 + i7 出力: 18 + i31 アルゴリズム ステップ1:開始 ステップ2:3つの複素数(my_