问题描述:
两种方式计算多项式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,看看结果吧:
结论:解决问题的效率与算法的优劣有关
时间: 2024-11-05 20:24:08