问题:写程序计算给定多项式在给定点x处的值。
最简单无脑的写法。直接带入(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n),循环,一项一项地加即可。
#include <iostream>
#include "math.h"
double f(int n, double a[],double x);
int main(){
int n=3;
double a[4]={1,1,1,1};
double x=1;
std::cout<< f(n, a, x);
return 0;
}
double f(int n, double a[], double x){
int i;
double p=a[0];
for(i=1;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}
秦九韶算法。(f(x)=a_0+x(a_1+x(...(a_{n-1}+x(a_n))...)))。从最后一个系数开始乘
#include <iostream>
#include "math.h"
double f(int n, double a[],double x);
int main(){
int n=3;
double a[4]={1,1,1,1};
double x=1;
std::cout<< f(n, a, x);
return 0;
}
double f(int n, double a[], double x){
int i;
double p=a[n];
for(i=n;i>0;i--)
p=a[i-1]+x*p;
return p;
}
使用clock() 常数CLK_TCK:机器始终每秒所走的时钟打点数
#include <iostream>
#include <time.h>
clock_t start, stop;
/*clock_t是clock()函数返回的变量类型*/
double duration;
/*记录被测函数运行时间,以秒为单位*/
int main(){
start = clock( );
MyFunction();
stop=clock();
duration =((double)(stop-start))/CLK_TCK;
}
测试程序:
#include <iostream>
#include <time.h>
#include <math.h>
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
#define MAXN 10
#define MAXK 1000000
clock_t start, stop;
/*clock_t是clock()函数返回的变量类型*/
double duration;
/*记录被测函数运行时间,以秒为单位*/
int main(){
int i;
double a[MAXN];
for(i=0;i<MAXN;i++) a[i]=(double)i;
start = clock( );
for(int i=1;i<MAXK;i++)
f1(MAXN, a, 1.1);
stop=clock();
duration =((double)(stop-start))/CLK_TCK;
std::cout<<duration<<std::endl;
start = clock( );
for(int i=1;i<MAXK;i++)
f2(MAXN, a, 1.1);
stop=clock();
duration =((double)(stop-start))/CLK_TCK;
std::cout<<duration<<std::endl;
return 0;
}
double f1(int n, double a[], double 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){
int i;
double p=a[n];
for(i=n;i>0;i--)
p=a[i-1]+x*p;
return p;
}
运行结果差一个数量级。解决问题方法的效率和算法的巧妙程度有关。