数据结构:多项式求值(polynomial evaluation)

发布于:2025-08-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

 多项式求值

从定义出发:什么是“求值”?

每一项该怎么算?

整体思路归纳


 多项式求值

对一个多项式 P(x),在给定某个 x = k 时,计算出 P(k) 的值。

这个操作叫做:多项式求值(polynomial evaluation)

我们还是基于上面已经定义好的结构体:数据结构:多项式表示(polynomial representation)-CSDN博客

struct Term {
    int coef;  // 系数
    int exp;   // 指数
};

struct Polynomial {
    int n;         // 实际项数
    struct Term* t; // 指向项数组的指针
};

从定义出发:什么是“求值”?

数学中,如果一个多项式是:

P(x) = a0 + a1*x + a2*x^2 + ... + an*x^n

那我们要计算:

P(k) = a0 + a1*k + a2*k^2 + ... + an*k^n

也就是说:

  • 把变量 x 替换成实际数值 k

  • 每一项都变成一个具体的数:coef * pow(k, exp)

  • 所有这些项的值相加,就是 P(k)

举个例子,我们要计算 P(2),就是:

= 3*2^5 + 2*2^2 + 7
= 3*32 + 2*4 + 7
= 96 + 8 + 7
= 111

✅ 第一个结论:我们只要能依次访问每一项,对每项做这个操作:

value = coef * (x ^ exp)

然后把所有项的值累加起来,就完成了求值。在上一步我们已经设计好了结构体

也就是说:

  • poly.t[0] 是第 1 项

  • poly.t[1] 是第 2 项

  • ...

  • poly.t[i] 包含:coefexp

所以,我们可以遍历这些项,分别取出 coefexp


每一项该怎么算?

我们现在要实现这个数学操作:value = coef * (x ^ exp)

在 C 语言中,求幂可以有两种做法:

✅ 方式1:使用标准库函数 pow

#include <math.h>
double value = coef * pow(x, exp);

优点:

  • 写法简单

缺点:

  • pow 返回 double 类型,会造成精度误差

  • 整数变浮点,会让最终结果不准确(尤其对整数多项式)

✅ 方式2:用循环自己实现整数幂(推荐)

我们可以写一个函数 intPower 来实现整数幂:

int intPower(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

优点:

  • 全部使用整数

  • 保证精度,适用于多项式中系数和变量都为整数的情况

所以每一项的值可以这样算:

int value = coef * intPower(x, exp);

整体思路归纳

现在我们已经有了所有构件,来总结整个过程:

输入:

  • 一个多项式 P(结构体 Polynomial)

  • 一个整数 x(要求值的输入)

步骤:

  1. 定义一个整型变量 sum,初始化为 0

  2. 遍历多项式的每一项(从 0 到 n - 1):

    • 对每一项:

      • 取出 coefexp

      • intPower(x, exp) 求幂

      • 乘以 coef 得到该项值

      • 加到 sum

  3. 返回 sum,就是 P(x) 的值

 完整代码

#include <stdio.h>
#include <stdlib.h>

// 一项 = 系数 * x^指数
struct Term {
    int coef;
    int exp;
};

// 多项式 = n 项 + 指向项数组的指针
struct Polynomial {
    int n;
    struct Term* t;
};

// 整数幂函数:计算 base^exp
int intPower(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

// 多项式求值函数:计算 P(x)
int evaluate(struct Polynomial p, int x) {
    int sum = 0;
    for (int i = 0; i < p.n; i++) {
        int term_val = p.t[i].coef * intPower(x, p.t[i].exp);
        sum += term_val;
    }
    return sum;
}

int main() {
    struct Polynomial p;
    p.n = 3;

    // 动态分配空间给 p.t
    p.t = (struct Term*) malloc(p.n * sizeof(struct Term));

    // 多项式:P(x) = 3*x^5 + 2*x^2 + 7
    p.t[0].coef = 3; p.t[0].exp = 5;
    p.t[1].coef = 2; p.t[1].exp = 2;
    p.t[2].coef = 7; p.t[2].exp = 0;

    // 求值:计算 P(2)
    int result = evaluate(p, 2);
    printf("P(2) = %d\n", result);

    free(p.t); // 释放空间
    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到