seansie's blog

zerojudge a006 程式碼

#include<iostream>
#include<cmath>
using namespace std;
int main (){
    int a,b,c,delta,ans1,ans2,temp1,temp2;
    cin>>a>>b>>c;
    delta=b*b-4*a*c;
    ans1=(-b+sqrt(b*b-4*a*c))/(2*a);
    ans2=(-b-sqrt(b*b-4*a*c))/(2*a);
    if(delta>0) {
        if(a>0)cout<<"Two different roots x1="<<ans1<<" , x2="<<ans2<<endl;
        else if (a<0) cout<<"Two different root x1="<<ans2<<" , x2="<<ans1<<endl;
    }
    else if (delta==0) cout<<"Two same roots x="<<ans1<<endl;
    else cout<<"No real root"<<endl;
    return 0;

}

解說

引入標頭檔與命名空間

#include<iostream>
#include<cmath>
using namespace std;

引入 iostream 來進行輸入輸出操作。

引入 cmath 來使用數學函數,如 sqrt

使用 std 命名空間,方便後續程式碼的書寫

主程式開始

int main() {

定義主函式 main

變數宣告與輸入

int a, b, c, delta, ans1, ans2;
cin >> a >> b >> c;

宣告整數變數 a, b, c 存放輸入的係數,delta 存放判別式,ans1, ans2 存放計算出的根。

使用 cin 從標準輸入讀入 a, b, c 的值。

計算判別式

delta = b * b - 4 * a * c;
  • 計算判別式 delta

計算根

ans1 = (-b + sqrt(delta)) / (2 * a);
ans2 = (-b - sqrt(delta)) / (2 * a);
  • 使用判別式 delta 計算兩個根 ans1ans2

判斷並輸出結果

if (delta > 0) {
  if (ans1 > ans2)
    cout << "Two different roots x1=" << ans1 << " , x2=" << ans2 << endl;
  else
    cout << "Two different roots x1=" << ans2 << " , x2=" << ans1 << endl;
} else if (delta == 0) {
  cout << "Two same roots x=" << ans1 << endl;
} else {
  cout << "No real root" << endl;
}

判斷 delta 的值來決定輸出內容:

  • delta > 0,表示有兩個不同的實根,進一步比較 ans1ans2,較大者在前輸出。
  • delta == 0,表示有兩個相同的實根,輸出相同的根。
  • delta < 0,表示無實根,輸出 “No real root”。

結束主程式

return 0;

主程式結束,返回 0

這段程式碼完成了對一元二次方程式根的計算和判斷,並根據不同情況輸出相應的結果。

這段程式碼在計算一元二次方程式的根時,考慮了判別式的不同值來決定輸出的結果。從時間複雜度和其他指標來看,我們可以進行以下評價:

時間複雜度

這段程式碼的時間複雜度主要來自於數學運算部分,包括計算判別式和平方根。這些操作都是常數時間操作(O(1))。因此,整段程式碼的時間複雜度為 O(1)。

空間複雜度

這段程式碼只使用了幾個整數變數來存儲輸入值和中間計算結果,空間複雜度也是 O(1)。

可讀性與正確性

這段程式碼的結構清晰,易於理解和維護。