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

【C++入門】二次方程式のすべての解(根)を求めるプログラムの書き方

二次方程式は一般に ax2 + bx + c = 0 の形で表されます。この方程式の解(根)は、以下に示す有名な「解の公式」によって求めることができます。

【C++入門】二次方程式のすべての解(根)を求めるプログラムの書き方

判別式による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() 関数を使用している点にも注目してください。

  1. 【初心者向け】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 を判別式と呼びます。判別式の値によって、根の性質が次のように変わります。判別式 >

  2. Javaで二次方程式のすべての解を求める方法【実数・複素数対応】

    本記事では、Javaを使って二次方程式のすべての解(根)を計算する方法をわかりやすく解説します。二次方程式とは2次の代数式のことで、その解は実数になる場合もあれば、虚数(複素数)になる場合もあります。どちらになるかは「判別式」と呼ばれる値によって決まります。 二次方程式の解と判別式 一般形が ax² + bx + c = 0 で表される二次方程式を考えます。このとき、判別式 D = b² − 4ac の符号によって、解の性質は次の3つの場合に分類されます。 b² < 4ac … 解は実数ではなく複素数(虚数)になる b² = 4ac … 解は実数で、2つの解は等しい(重解) b² >