秦九韶演算法

Merlin·Lee發表於2024-11-24

這應該是筆者寫的第一道多項式有關的題目
沒辦法,我實在是太菜了
就是這道題
題面已經寫的很露骨了
但是如果你拿傳統的列舉每個i去帶入,並且你使用了快讀+吸氧等一系列的最佳化,你就可以獲得30pts的好成績
如果你開了高精度,那就是50pts
所以正解就是秦九韶演算法(第一眼我還以為是海倫——秦九韶公式……)
我谷的題解說人教數學書必修三封面有,我怎麼沒看到?
反正就是用他啦~

內容

先給出一個一元三次多項式:
\(f(x)=\sum_{i=0}^{3}(i+1)\times x^i\)
對於他,我們有這樣的一個答案:
\(ans=x\times(x\times(4\times x+3)+2)+1\)
然後我們推廣到一元n次多項式:
\(f(x)=\sum_{i=0}^{n}(i+1)\times x^i\)
那就應該是:
\(ans=((((a[n])\times x+a[n-1])\times x+a[n-2])\times x...+a_1)\times x+a_0\)

最佳化

如果使用樸素演算法求解第一個式子的話,我們需要6次乘法與3次加法
那麼對於第二個式子就是\(\frac{n(n+1)}{2}\)次乘法與\(n\times 1=n\)次加法
所以時間複雜度就是\(O(n^2)\)這顯然是無法接受的
而我們使用秦九韶演算法由內向外逐層計算多項式的值
就可以將時間複雜度最佳化到\(O(n)\)這個級別。

實現

我們把百度百科上的程式碼直接粘過來吧:

秦九韶演算法
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int main() {
    int n;
    cout << "請輸入多項式的次數 :";
    cin >> n;
    double *a = new double[n+1];//n次多項式申請n+1大小的陣列
    cout << "請輸入多項式的係數(最高次項開始):" << endl;
    for(int i = n; i >= 0; i --)
        cin >> a[i];//讀入各項係數
    double x0,ans=a[n];
    cout << "請輸入 X0 " << endl;
    cin >> x0;
    for(int i = n-1;i >= 0;i --)
        ans = ans*x0 + a[i];//最高次項開始,往外展開
    cout << "多項式在X0出的函式值為:" << ans << endl;
    delete []a;//釋放動態記憶體
    return 0;
}

相關文章