目录
多项式求值
对一个多项式 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.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;
}