一个多项式的描述

问题部分

  • 描述:

一元多项式的标准表达式可以写为 : $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

猜你喜欢

转载自www.cnblogs.com/HPECKER/p/11664668.html
今日推荐