目录
从定义出发 —— 什么是多项式?
数学中,一个一元多项式是由多个项(term)构成的,每一项的形式是:
系数 × 变量的幂次
一个一元多项式(single-variable polynomial)是形如:
P(x) = a0 + a1*x + a2*x^2 + ... + an*x^n
其中:
x
是变量a0, a1, ..., an
是对应每一项的 系数(coefficient)每个 x^k 是幂次,k 是“指数”或“指数幂”(exponent)
n
是多项式的 最高次数(degree)
举个例子:P(x) = 5*x^3 + 0*x^2 + 2*x + 7
可以看成是 4 项相加:
第 1 项:5*x^3
第 2 项:0*x^2(虽然结果是0,我们还是可以记下来)
第 3 项:2*x
第 4 项:7 (可以看作 7*x^0)
目标本质是什么?
我们想要用程序的结构(数组、结构体、链表等)去保存这个多项式里的每一项。
所以我们先来思考:
一个多项式项(term)需要保存什么信息?
答:两个信息:
系数(例如:5)
指数(例如:3)
我们要解决的问题是:如何使用 C 语言的数据结构来存储这样的“系数-指数”对的集合?
探索表示方式
第一步:如何表示一个项?
假设我们有这个多项式:P(x) = 5*x^4 + 0*x^3 + 2*x^1 + 7
如何表示
(a2, 2)
(系数, 指数) 这样的东西?
我们尝试用一个数组 int coef[]
表示
coef[0] = 7; // x^0
coef[1] = 2; // x^1
coef[2] = 0; // x^2
coef[3] = 0; // x^3
coef[4] = 5; // x^4
问题是:
当指数变大(比如出现 x^100),我们就得分配很多空间,即使很多项为 0。
我们实际上只关心那些“系数 ≠ 0 的项”,不想保存无效信息。
我们希望两个整数能绑在一起。C语言中,我们最基础的方法是结构体。
✅ 结论:我们只保存“有效项”(即系数不为 0 的项),每一项用结构体 Term 表示:
struct Term {
int coef; // 系数
int exp; // 指数
};
第二步:如何存多个项?
一个多项式是多个项的集合。
从数据的角度,我们有以下需求:表示一组结构体 Term,存储在一起,方便访问
最直接的方式是:数组
为什么用数组?因为数组是连续的、可以用索引访问、逻辑简单。
为什么不用链表?我们现在先只讲“数组表示法”。
一个多项式是若干个 Term 构成的,我们就可以开一个结构体数组:
struct Term terms[100];
⚠️ 但又出现一个新问题:
数组开了 10 个,但我们实际也许只用了 3 个项。我们就必须知道:
当前实际用了几个项?
所以我们需要一个变量:记录项数
我们可以定义:
int n; // 表示多项式实际的项数
这时,我们可以有两个变量:
n
表示实际项数terms[n]
表示 n 个项,每个项是 (coef, exp)
第三步:再抽象一点,用结构体封装多项式
多项式本质上就是一组“项” + 这组项的个数
因此,我们用一个结构体 Polynomial
来封装这个“多项式”:
struct Polynomial {
int n; // 实际有效项数
struct Term* t; // 指向 Term 数组的指针
};
为什么用 Term* t
而不是 Term t[100]
?
两个原因:
多项式的项数不固定,想动态创建
t
是一个指针,更灵活,可传参、分配空间
我们可以在运行时这样写:
poly.n = 3;
poly.t = (struct Term*) malloc(poly.n * sizeof(struct Term));
到目前为止,我们得到了:
每一项:用
Term
表示(coef, exp)
多项式:用
Polynomial
表示一组 Term 和项数 n
示例推导
表示多项式:P(x) = 3*x^5 + 2*x^2 + 7
我们一步步来看:
第一步:有几项?
答案是 3 项,对应:
系数 | 指数 |
---|---|
3 | 5 |
2 | 2 |
7 | 0 |
第二步:准备数据结构
struct Polynomial p;
p.n = 3;
p.t = (struct Term*) malloc(p.n * sizeof(struct Term));
第三步:填充每一项
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;
完整代码
#include <stdio.h>
#include <stdlib.h>
// 表示一项:coef * x^exp
struct Term {
int coef;
int exp;
};
// 表示一个多项式:n 个项,t 指向这些项
struct Polynomial {
int n;
struct Term* t;
};
int main() {
// 1. 创建一个多项式变量
struct Polynomial p;
// 2. 指定这个多项式有 3 项
p.n = 3;
// 3. 分配数组空间来存这 3 项
p.t = (struct Term*) malloc(p.n * sizeof(struct Term));
// 4. 设置每一项: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;
// 5. 打印多项式
printf("P(x) = ");
for (int i = 0; i < p.n; i++) {
printf("%d*x^%d", p.t[i].coef, p.t[i].exp);
if (i != p.n - 1) printf(" + ");
}
printf("\n");
// 6. 释放空间
free(p.t);
return 0;
}