数据结构:多项式求值(polynomial evaluation)
目录
多项式求值
从定义出发:什么是“求值”?
每一项该怎么算?
整体思路归纳
多项式求值
对一个多项式 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]
包含:coef
和exp
所以,我们可以遍历这些项,分别取出 coef
和 exp
每一项该怎么算?
我们现在要实现这个数学操作: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
(要求值的输入)
步骤:
-
定义一个整型变量
sum
,初始化为 0 -
遍历多项式的每一项(从 0 到 n - 1):
-
对每一项:
-
取出
coef
和exp
-
用
intPower(x, exp)
求幂 -
乘以
coef
得到该项值 -
加到
sum
上
-
-
-
返回
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.tp.t = (struct Term*) malloc(p.n * sizeof(struct Term));// 多项式:P(x) = 3*x^5 + 2*x^2 + 7p.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;
}