欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一个多项式的描述

程序员文章站 2022-06-17 08:18:46
问题部分 描述: 一元多项式的标准表达式可以写为 : $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[]$里 ......

问题部分

  • 描述:

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