一元多项式的标准表达式可以写为 : $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.cnblogs.com/HPECKER/p/11664668.html