现在问题是计算多项式:
f(x)=a[0]+a[1]*x^1+a[2]*x^2+...+a[n]*x^n
以下代码提供朴素版和优化版(optimize):
//给定多项式在给定x处的值
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
double duration;//持续时间
clock_t start,stop;
using namespace std;
const int N=1000;
const int MAXK=1e7;//
void optimize(int index,double a[],double pos)//优化版本
//f(x)=a[0]+x(a[1]+x(a[2]+x(...(a[n-1]+x*a[n]))...)
{
double sum=a[index-1];
for(int i=index-1;i>0;--i)
{
sum=sum*pos+a[i-1];
//printf("sum=%lf\n",sum);
}
//printf("sum=%lf\n",sum);
}
void f(int index,double a[],double pos)//朴素版本
{
double sum=a[0];
for(int i=1;i<index;++i)
{
sum+=(a[i]*pow(pos,i));
//printf("sum=%lf\n",sum);
}
//printf("sum=%lf\n",sum);
}
int main()
{
int y;
double a[N],x;
cout<<"输入的常数项个数:";
cin>>y;
cout<<"输入每个常数项:"<<endl;
for(int i=0;i<y;++i)
{
cin>>a[i];
}
cout<<"输入给定x值:";
cin>>x;
start=clock();
for(int i=0;i<=MAXK;++i)
f(y,a,x);
stop=clock();
duration=((double)(stop-start))/CLK_TCK/MAXK;
printf("trik1=%f\n",(double)(stop-start));
printf("duration1=%6.2e\n",duration);
start=clock();
for(int i=0;i<=MAXK;++i)
optimize(y,a,x);
stop=clock();
duration=((double)(stop-start))/CLK_TCK/MAXK;
printf("trik2=%f\n",(double)(stop-start));
printf("duration1=%6.2e\n",duration);
return 0;
}