【C++入門】二次方程式のすべての解(根)を求めるプログラムの書き方
二次方程式は一般に ax2 + bx + c = 0 の形で表されます。この方程式の解(根)は、以下に示す有名な「解の公式」によって求めることができます。

判別式による3つの場合分け
二次方程式の解の性質は、判別式 D = b2 − 4ac の値によって、次の3通りに分類されます。
- b2 < 4ac の場合:解は実数にならず、虚数を含む複素数になります。
- b2 = 4ac の場合:解は実数となり、両方の解が同じ値(重解)になります。
- b2 > 4ac の場合:解は実数となり、異なる2つの実数解を持ちます。
それでは、これらすべての場合に対応した、二次方程式の解を求めるC++プログラムを見ていきましょう。
サンプルプログラム
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int a = 1, b = 2, c = 1;
float discriminant, realPart, imaginaryPart, x1, x2;
if (a == 0) {
cout << "This is not a quadratic equation";
}else {
discriminant = b*b - 4*a*c;
if (discriminant > 0) {
x1 = (-b + sqrt(discriminant)) / (2*a);
x2 = (-b - sqrt(discriminant)) / (2*a);
cout << "Roots are real and different." << endl;
cout << "Root 1 = " << x1 << endl;
cout << "Root 2 = " << x2 << endl;
} else if (discriminant == 0) {
cout << "Roots are real and same." << endl;
x1 = (-b + sqrt(discriminant)) / (2*a);
cout << "Root 1 = Root 2 =" << x1 << endl;
}else {
realPart = (float) -b/(2*a);
imaginaryPart = sqrt(-discriminant)/(2*a);
cout << "Roots are complex and different." << endl;
cout << "Root 1 = " << realPart << " + " << imaginaryPart << "i" << endl;
cout << "Root 2 = " << realPart << " - " << imaginaryPart << "i" << endl;
}
}
return 0;
}実行結果
Roots are real and same. Root 1 = Root 2 =-1
この例では a=1、b=2、c=1 を代入しているため、判別式は 2² − 4×1×1 = 0 となり、「重解」の場合に該当します。その結果、両方の解が −1 と出力されています。
プログラムの解説
上記のプログラムでは、まず最初に判別式(discriminant)を計算しています。また、係数 a が 0 の場合は二次方程式とはならないため、そのチェックも冒頭で行っています。
① 判別式が 0 より大きい場合(異なる2つの実数解)
判別式が正であれば、解は実数であり、互いに異なる2つの値を持ちます。該当するコード部分は以下の通りです。
if (discriminant > 0) {
x1 = (-b + sqrt(discriminant)) / (2*a);
x2 = (-b - sqrt(discriminant)) / (2*a);
cout << "Roots are real and different." << endl;
cout << "Root 1 = " << x1 << endl;
cout << "Root 2 = " << x2 << endl;
}② 判別式が 0 の場合(重解)
判別式がちょうど 0 であれば、2つの解は等しい実数(重解)となります。
else if (discriminant == 0) {
cout << "Roots are real and same." << endl;
x1 = (-b + sqrt(discriminant)) / (2*a);
cout << "Root 1 = Root 2 =" << x1 << endl;
}③ 判別式が 0 未満の場合(複素数解)
判別式が負の場合、解は複素数になります。このとき、sqrt 関数に渡すために判別式の符号を反転させ(−discriminant)、実部と虚部をそれぞれ計算して出力します。
else {
realPart = (float) -b/(2*a);
imaginaryPart = sqrt(-discriminant)/(2*a);
cout << "Roots are complex and different." << endl;
cout << "Root 1 = " << realPart << " + " << imaginaryPart << "i" << endl;
cout << "Root 2 = " << realPart << " - " << imaginaryPart << "i" << endl;
}まとめ
このように、判別式の値を判定する条件分岐を組み合わせることで、二次方程式が取りうるすべてのパターン(異なる実数解・重解・複素数解)に柔軟に対応できるプログラムを作成できます。平方根の計算には <cmath> ヘッダーの sqrt() 関数を使用している点にも注目してください。
-
【初心者向け】C言語で二次方程式の根(解)を求めるプログラムの作り方
問題ソフトウェア開発の手法をC言語に適用し、二次方程式の根(解)を求めるプログラムを作成します。解決策二次方程式 ax2 + bx + c = 0 の根を求めます。二次方程式には必ず2つの根が存在します。分析入力:係数 a、b、c の値出力:根 r1、r2 の値手順(解の公式)二次方程式の根は、以下の「解の公式」によって求めることができます。$r_{1}=\frac{-b+\sqrt{b^2-4ac}}{2a}$$r_{2}=\frac{-b-\sqrt{b^2-4ac}}{2a}$ここで、b2 − 4ac を判別式と呼びます。判別式の値によって、根の性質が次のように変わります。判別式 >
-
Javaで二次方程式のすべての解を求める方法【実数・複素数対応】
本記事では、Javaを使って二次方程式のすべての解(根)を計算する方法をわかりやすく解説します。二次方程式とは2次の代数式のことで、その解は実数になる場合もあれば、虚数(複素数)になる場合もあります。どちらになるかは「判別式」と呼ばれる値によって決まります。 二次方程式の解と判別式 一般形が ax² + bx + c = 0 で表される二次方程式を考えます。このとき、判別式 D = b² − 4ac の符号によって、解の性質は次の3つの場合に分類されます。 b² < 4ac … 解は実数ではなく複素数(虚数)になる b² = 4ac … 解は実数で、2つの解は等しい(重解) b² >