首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言求一元二次方程實數根:判別式分類與數值穩定性完全指南

     編輯:關於C語言

題目描述

輸入係數 a, b, c (a ≠ 0),求方程 `ax² + bx + c = 0` 的實數根。

  • 兩個不等實根 → 較大根先輸出,每行一個,保留兩位小數
  • 兩個相等實根 → 輸出一個,保留兩位小數
  • 無實根 → 輸出 `No answer!`

標準解法

#include 
#include 

int main() {
    double a, b, c;
    scanf("%lf %lf %lf", &a, &b, &c);
    
    double disc = b*b - 4*a*c;
    if (disc < 0) {
        printf("No answer!\n");
    } else if (disc == 0) {
        double x = -b / (2*a);
        printf("%.2f\n", x);
    } else {
        double sqrt_disc = sqrt(disc);
        double x1 = (-b + sqrt_disc) / (2*a);
        double x2 = (-b - sqrt_disc) / (2*a);
        if (x1 < x2) { double t = x1; x1 = x2; x2 = t; } // 確保大根在前
        printf("%.2f\n%.2f\n", x1, x2);
    }
    return 0;
}

數值穩定性改進(避免災難性抵消)

當 `b² ≫ 4ac` 且 `b > 0` 時,`-b + sqrt(b²-4ac)` 發生大數吃小數,精度損失嚴重。

改進公式:

double q = -0.5 * (b + (b > 0 ? sqrt_disc : -sqrt_disc));
double x1 = q / a;
double x2 = c / q; // 利用 x1*x2 = c/a

此寫法在科學計算庫中標準使用。

經典應用題解析

題 1:方程 a(1+x²) + 2bx = c(1-x²) 有兩相等實根,判斷 a,b,c 為邊的三角形

整理:(a+c)x² + 2bx + (a-c) = 0
Δ = 0 → 4b² - 4(a+c)(a-c) = 0 → a² = b² + c² → **直角三角形**(a 為斜邊)。

題 2:方程 (a-c)x² - 2(a-b)x + (a+c-2b) = 0 有兩相等實根,證明等腰

Δ = 0 → (a-b)² - (a-c)(a+c-2b) = 0 → 展開化簡 → (b-c)² = 0 → b = c → **等腰三角形**。

題 3:已知 GCD=4, LCM=24,求兩數

設數為 4x, 4y (互質),LCM=4xy=24 → xy=6。互質因子對 (1,6)→(4,24), (2,3)→(8,12)。選項中 **8 與 12** 符合。

邊界與細節

  • 係數為 `double`,避免整數除法截斷
  • `disc == 0` 浮點比較建議用 `fabs(disc) < 1e-12`
  • 輸出格式嚴格遵循題目:大根先、保留兩位小數、無實根固定字符串
  • `math.h` 需鏈接數學庫:`gcc -lm`

總結

一元二次方程求根是數值計算基石。**判別式分類**是邏輯核心,**數值穩定公式**是工程標準。結合幾何題(三角形判斷)能深化對判別式幾何意義的理解。實際開發中推薦使用成熟數學庫(如 Eigen、GSL)處理多項式求根。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved