雷猴⊆ಠ ω ಠ⊇

我是熊尼,這篇網誌的第二位寫手。

今天要來完成的是"高中程式設計與APCS先修檢測"一書中的

P76頁:解一元二次方程式

也就是這本書↓

截圖 2020-01-29 下午2.36.46

首先看一下效果

 

有理數:

請輸入第一數(b):
10
請輸入第二數(a):
2
請輸入第三數(c):
3
根1 = -1
根2 = -18

實數:

請輸入第一數(b):
10
請輸入第二數(a):
5
請輸入第三數(c):
5
實數 = -25

無理數:

請輸入第一數(b):
2
請輸入第二數(a):
9
請輸入第三數(c):
6
該數為無理數

開始~


1. 數學理論

在開始之前首先複習一下國中數學XD

最重要要了解,一元二次方程式有三種解法

分別為

  1. 配方法
  2. 十字交乘法
  3. 公式解

前面兩種方法"配方法"以及"十字交乘法",主要是給人類用的

但是有些情形下無法使用就是了...

而根據咱偉哉演算法的最高指導原則"一法通則萬法通"之下

用程式去解的話我會使用"公式解"

 

那公式寫而言數學模型就長這樣:

ax2+bx+c=0

Ex:2x2+10x+3=0

image014

上面的公式解中根號內部的式子(b2-4ac)成為"判別式(D)"

功能為用於判斷數值是否為"有理數"

而由於判斷式若小於0,那麼x就是虛根;算數時將之列為"不存在"

因此程式中也比照辦理。

 

2. 程式實踐

☗以下程式若有需要直接複製即可

C語言:

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


int main(int argc, const char * argv[]) {
    int a,b,c,D,root1,root2;
    
    printf("請輸入第一數(b):\n");
    scanf("%d",&b);
    printf("請輸入第二數(a):\n");
    scanf("%d",&a);
    printf("請輸入第三數(c):\n");
    scanf("%d",&c);

    D = b*b - 4*a*c;
    root1 = (-b + sqrt(D))/2*a;
    root2 = (-b - sqrt(D))/2*a;
    
    if(D > 0){
        printf("根1 = %d\n", root1);
        printf("根2 = %d\n", root2);
    }else if(D == 0){
        printf("實數 = %d\n",root1);
    }else{
        printf("該數為無理數\n");
    }

    return 0;
}

C++:

#include <iostream>
#include <math.h>

using namespace std;

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

    cin >> a >> b >> c;

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

    root1 = (-b + sqrt(D))/2*a;
    root2 = (-b - sqrt(D))/2*a;

    if(D > 0){
        cout << "root1 = " << root1 << endl;
        cout << "root2 = " << root2 << endl;
    }else if(D == 0){
        cout << "double root = ";
        cout << root1 << endl;
    }else{
        cout << "no real root\n";
    }

}

3. 程式講解

以C語言為例:

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


int main(int argc, const char * argv[]) {
    int a,b,c,D,root1,root2;
    
    printf("請輸入第一數(b):\n");
    scanf("%d",&b);
    printf("請輸入第二數(a):\n");
    scanf("%d",&a);
    printf("請輸入第三數(c):\n");
    scanf("%d",&c);

    D = b*b - 4*a*c;
    root1 = (-b + sqrt(D))/2*a;
    root2 = (-b - sqrt(D))/2*a;
    
    if(D > 0){
        printf("根1 = %d\n", root1);
        printf("根2 = %d\n", root2);
    }else if(D == 0){
        printf("實數 = %d\n",root1);
    }else{
        printf("該數為無理數\n");
    }

    return 0;
}

紅色部分就是上述的判別式

一般在實際解題的時候,也都是直接先以判別式判斷後才開始解題

藍色部分則是image014公式本體

綠色便是結果輸出。


結語

這篇將我們在國中數學中常出現的一元二次方程式化為了程式寫出來

希望對於今天的講解可以幫助到您

一元二次方程式而言,可能大部分的人在考完高中就把它忽略了(不是忘了,只是忽略)

但是實際上這是日後微分方程的重要基礎

而這些數學理論又會再日後(若是資通科)的一些電磁波,或者各項工程等實際應用中會用上

我是覺得蠻重要的啦 030

那幾天的介紹到這

感謝點閱~喜歡記得加到我的最愛哦!

arrow
arrow

    碼農日常 發表在 痞客邦 留言(1) 人氣()