问题描述:
两种方式计算多项式a0+a1*x+a2*x^2+a3*x^3+.......(普通算法以及秦九韶算法)在某处x的值,通过调用<time.h>中的函数tick(),计算两种方式的运算时间,得出。。。。。预知结论为何,请看下面代码:
代码如下:
#include<stdio.h>
#include<math.h> //pow
#include<time.h> //tick
#define MAXODER 300 //最大阶乘数
#define REPEAT 1e5 //函数重复执行次数(一次执行所需时间太短)
//普通算法
double Multinomial_1(int a[],int n,double x)
{
double result = 0;
int i;
for(i=0;i<=n;++i)
{
result = result + a[i]*pow(x,i);//多项式求值
}
return result;
}
//秦九韶算法
double Multinomial_2(int a[],int n,double x)
{
double result = 0;
int i;
for(i=n;i>0;--i)
{
result = a[i-1] + a[i]*pow(x,i);//多项式求值:提取公因式
}
return result;
}
//计算函数运行一次所用时间
void time(clock_t start,clock_t end)
{
double duration; //存放函数执行时间
printf("%f\n",(double)(end - start)); //Multinomial_1函数执行打点的次数
duration = ((double)(end - start))/CLOCKS_PER_SEC/REPEAT;//函数执行一次所需时间---CLOCKS_PER_SEC 每秒钟打点次数
printf("%6.2e\n",duration);
}
int main()
{
int a[MAXODER+1]; //存放多项式的系数
double x; //原变量
int i; //循环因子
clock_t start1; //记录普通函数运行打点次数
clock_t end1; //clock_t是tick()函数返回值的数据类型
clock_t start2; //记录秦九韶算法函数运行打点次数
clock_t end2;
for(i=0;i<=MAXODER;++i) //初始化,多项式的各系数
{
a[i] = i;
}
printf("please input a num:");//输入要求的值
scanf("%lf",&x); //注意此处输入的格式“%lf”而不是"%f"
//普通算法
start1 = clock(); //函数从开始执行到此处打点的次数
for(i=0;i<REPEAT;i++)
{
Multinomial_1(a,MAXODER,x);
}
end1 = clock(); //函数从开始执行到此处打点的次数
//秦九韶算法
start2 = clock(); //函数从开始执行到此处打点的次数
for(i=0;i<REPEAT;i++)
{
Multinomial_2(a,MAXODER,x);
}
end2 = clock();
printf("普通算法:\n");
time(start1,end1);
printf("秦九韶算法:\n");
time(start2,end2);
return 0;
}
输入x=8,看看结果吧:
结论:解决问题的效率与算法的优劣有关