問題部分 描述: 一元多項式的標準表達式可以寫為 : $f(x) = a_{ 0 } + a_{ 1 }x + \dots + a_{n 1} x^{n 1} + a_{n} x^{n}$。現給定一個多項式的階數$n$,並將全體繫數$\{a_{i}\}_{i = 0}^{n}$存放在數組$a[]$里 ...
問題部分
- 描述:
一元多項式的標準表達式可以寫為 : $f(x) = a_{ 0 } + a_{ 1 }x + \dots + a_{n - 1} x^{n - 1} + a_{n} x^{n}$。現給定一個多項式的階數$n$,並將全體繫數${a_{i}}_{i = 0}^{n}$存放在數組$a[]$里。請寫程式計算這個多項式在給定點$x$處的值。
代碼部分
#include <stdio.h>
#include <time.h>
#include <math.h>
clock_t start, stop; // clock_t 是 clock() 函數返回的變數類型
double duration; // 記錄被測函數運行時間,以秒為單位
#define MAXN 10 // 多項式最大項數,即多項式階數 +1
#define MAXK 1e7 // 被測函數最大重覆調用次數
double f1(int n,double a[],double x){
// 計算階數為n,繫數為a[0] ... a[n]的多項式在x點的值
int i;
double p = a[0];
for(i = 1; i <= n; i++){
p += (a[i] * pow(x,i));
}
return p;
}
double f2(int n, double a[],double x){
// 計算階數為n,繫數為a[0] ... a[n]的多項式在x點的值
int i;
double p = a[n];
for (i = n; i > 0; i--){
p += a[i - 1] + x * p;
}
return p;
}
void run(double(*f)(int , double *, double), double a[], int case_n){
// 此函數用於測試被測試函數(*f)的運行時間,並且根據 case_n 輸出相應的結果
// case_n 是輸出的函數編號: 1 代表函數 f1; 2 代表函數 f2
// 不在測試範圍內的準備工作寫在 clock() 調用之前
int i;
start = clock(); // 開始計時
for (i = 0; i < MAXK; i++){ // 重覆調用函數以獲得充分多的時鐘打點數
(*f)(MAXN - 1, a, 1.1);
}
// 被測函數加在這裡
stop = clock(); // 停止計時
duration = ((double)(stop - start)) / CLOCKS_PER_SEC; // 計算運行時間
// 註意 CLOCKS_PER_SEC (或 CLK_TCK)是機器時鐘每秒所走的時鐘打點數
// 其他不在測試範圍的處理寫在後面,例如輸出 duration 的值
printf("tricks%d = %f \n", case_n,(double)(stop -start));
printf("duration%d = %6.2e \n", case_n,duration);
}
int main(){
int i;
double a[MAXN]; // 存儲多項式的繫數
// 為本題的多項式繫數賦值,即 a[i] = i
for(i = 0; i < MAXN; i++){
a[i] = (double)i;
}
run(f1,a,1);
run(f2,a,2);
return 0;
}
測試結果
tricks1 = 13334051.000000
duration1 = 1.33e+01
tricks2 = 1560921.000000
duration2 = 1.56e+00