Back
Clang & Wasm 教學

C語言補充教材 - 一元二次方程式的求解

Quadratic Equation Solver


數學背景複習:一元二次方程式是什麼?

在國中數學中,一元二次方程式指的是如下形式的方程式:

ax2+bx+c=0ax^2 + bx + c = 0

其中:

  • a$、$b$、$c 為實數常數,且 a0a \neq 0
  • xx 是未知數
  • 解這個方程式的目的是找出 xx 的值,使整個等式成立。

✅ 解法:求根公式(又稱判別式法)

我們使用以下公式來求解方程式的根(也就是 xx 的值):

x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

其中:

  • b24acb^2 - 4ac 被稱為判別式(discriminant),記為 DD
  • 根據判別式的值,我們有以下三種情況:
判別式 DD 根的情況
D>0D > 0 兩個不相等的實數根
D=0D = 0 兩個相等的實數根(重根)
D<0D < 0 無實數解(為複數根)

✳️ 一元二次方程式的求根公式(判別式法)推導

我們從一元二次方程式的一般形式開始:

ax2+bx+c=0(其中 a0ax^2 + bx + c = 0 \quad \text{(其中 } a \ne 0 \text{)}

🔄 Step 1:將兩邊同除以 aa

目的是讓前面的係數變成 1,方便操作:

x2+bax+ca=0x^2 + \frac{b}{a}x + \frac{c}{a} = 0

🧩 Step 2:移項,把常數項移到等號右邊

x2+bax=cax^2 + \frac{b}{a}x = -\frac{c}{a}

🟨 Step 3:左右兩邊同時「配方」(Completing the square)

我們想讓左邊變成一個完整的平方:

  • (b2a)2\left( \frac{b}{2a} \right)^2 加到左右兩邊:
x2+bax+(b2a)2=ca+(b2a)2x^2 + \frac{b}{a}x + \left( \frac{b}{2a} \right)^2 = -\frac{c}{a} + \left( \frac{b}{2a} \right)^2

🧮 Step 4:化簡兩邊

左邊是一個平方公式:

(x+b2a)2=b24ac4a2\left( x + \frac{b}{2a} \right)^2 = \frac{b^2 - 4ac}{4a^2}

🧾 Step 5:開根號並解出 x

x+b2a=±b24ac2ax + \frac{b}{2a} = \pm \frac{\sqrt{b^2 - 4ac}}{2a}

🔚 Step 6:移項得出「求根公式」

x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

這就是我們熟悉的 一元二次方程式解公式


🧠 判別式 D=b24acD = b^2 - 4ac 的角色

在公式中,根號裡的那部分 b24acb^2 - 4ac 決定了解的性質,我們稱它為「判別式」,記為 DD

  • D>0D > 0:有兩個不相等的實數根
  • D=0D = 0:有一個實數重根
  • D<0D < 0:沒有實數根(出現虛數)

📌 小提示(適合寫在黑板或投影片上)

「公式不是硬背來的,它來自基本的代數技巧 —— 配方法(completing the square)!」

這樣的理解能幫助學生不只是「套公式」,而是真正知道它的來源,也能應用在其他需要配方的地方(例如拋物線頂點公式的推導等)。


如果你有需要,我可以幫你把這段轉成簡報、或加上手寫風格圖解。是否需要圖示或 LaTeX PDF 格式教材?

💻 C語言實作:求解一元二次方程式

🔧 步驟說明

  1. 輸入係數 a$、$b$、$c
  2. 計算判別式 D=b24acD = b^2 - 4ac
  3. 根據 DD 的值分類討論並求出解

✅ 範例程式碼:

#include <stdio.h>
#include <math.h>

int main() {
    double a, b, c;
    double discriminant, root1, root2;

    printf("輸入一元二次方程式 ax^2 + bx + c = 0 的係數 a, b, c:\n");
    scanf("%lf %lf %lf", &a, &b, &c);

    if (a == 0) {
        printf("這不是一元二次方程式,因為 a 不能為 0。\n");
        return 1;
    }

    discriminant = b * b - 4 * a * c;

    if (discriminant > 0) {
        root1 = (-b + sqrt(discriminant)) / (2 * a);
        root2 = (-b - sqrt(discriminant)) / (2 * a);
        printf("有兩個不同的實數根:x1 = %.2lf, x2 = %.2lf\n", root1, root2);
    } 
    else if (discriminant == 0) {
        root1 = -b / (2 * a);
        printf("有一個重根:x = %.2lf\n", root1);
    } 
    else {
        double realPart = -b / (2 * a);
        double imagPart = sqrt(-discriminant) / (2 * a);
        printf("無實數解,為複數根:\n");
        printf("x1 = %.2lf + %.2lfi\n", realPart, imagPart);
        printf("x2 = %.2lf - %.2lfi\n", realPart, imagPart);
    }

    return 0;
}

SNPQ © 2025