問題部分
- 描述:
一元多項式的標準運算式可以寫為 : $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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69233.html
標籤:C
