当前位置: 首页 > news >正文

数据结构:多项式加法(Polynomial Addition)

目录

多项式加法

什么是多项式加法?

我们怎么找“相同指数”的项?

归并思想:遍历两个数组合并

最终代码实现:加法函数 add(A, B) → C


多项式加法

我们有两个多项式 A(x)B(x),希望计算出它们的和:C(x) = A(x) + B(x)

这就是多项式加法(Polynomial Addition)

我们要在 C语言中,用我们之前定义的数据结构来实现这个运算。现在开始从最基本定义出发推导整个过程。

回顾我们已有的数据结构:数据结构:多项式表示(polynomial representation)-CSDN博客

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

什么是多项式加法?

A(x) = a1*x^e1 + a2*x^e2 + ... + am*x^em
B(x) = b1*x^f1 + b2*x^f2 + ... + bn*x^fn

我们要构造:

C(x) = (a1*x^e1 + b1'*x^e1) + (a2*x^e2 + b2'*x^e2) + ...

也就是说:

  • 指数相同的项合并(系数相加)

  • 指数不同的项原样保留

举个具体例子:

A(x) = 3*x^4 + 2*x^2 + 7
B(x) = 5*x^3 + 2*x^2 + 1

相加:

  • 3*x^4 保留

  • 5*x^3 保留

  • 2x^2 + 2x^2 = 4*x^2

  • 7 + 1 = 8

所以结果:

C(x) = 3*x^4 + 5*x^3 + 4*x^2 + 8

 ✅ 第一个结论:我们必须“按指数合并项”


我们怎么找“相同指数”的项?

这是 C 语言中的实际挑战。

如果两个多项式中的项:

  • 是按照指数从大到小排序的,那我们可以用“归并思想”来合并

  • 否则就只能每项都去另一边“找一圈”,效率低(O(n²))

所以我们规定前提:

所有多项式的项,必须按指数降序排列(从大到小)

✅ 第二个结论:我们将两个排好序的项数组合并,遇到相同指数就合并,不同指数就直接放入结果。


归并思想:遍历两个数组合并

我们设有两个多项式 AB

struct Polynomial A, B;

它们各有 A.nB.n 项,对应数组 A.t[]B.t[]

我们创建一个新多项式 C,记录结果:

struct Polynomial C;
C.t = (struct Term*) malloc((A.n + B.n) * sizeof(struct Term));

最多有 A.n + B.n 项(如果两边指数完全不同)

用三个指针变量:

int i = 0; // 遍历 A
int j = 0; // 遍历 B
int k = 0; // 当前写入 C 的位置

✅ 遍历规则(归并过程):

当 i < A.n 且 j < B.n 时

如果 A.t[i].exp > B.t[j].exp:

  • 把 A.t[i] 放进 C.t[k]

  • i++, k++

如果 A.t[i].exp < B.t[j].exp:

  • 把 B.t[j] 放进 C.t[k]

  • j++, k++ 

如果 A.t[i].exp == B.t[j].exp:

  • 系数相加:new_coef = A.t[i].coef + B.t[j].coef

  • 如果 new_coef ≠ 0:

    • 把 (new_coef, exp) 放进 C.t[k]

    • k++

  • i++, j++

 🔚 最后处理剩余项:

  • 如果 A 还有剩余:while (i < A.n) { C.t[k++] = A.t[i++]; }

  • 如果 B 还有剩余:while (j < B.n) { C.t[k++] = B.t[j++]; }


最终代码实现:加法函数 add(A, B) → C

struct Polynomial add(struct Polynomial A, struct Polynomial B) {struct Polynomial C;C.t = (struct Term*) malloc((A.n + B.n) * sizeof(struct Term));int i = 0, j = 0, k = 0;while (i < A.n && j < B.n) {if (A.t[i].exp > B.t[j].exp) {C.t[k++] = A.t[i++];} else if (A.t[i].exp < B.t[j].exp) {C.t[k++] = B.t[j++];} else {int sum_coef = A.t[i].coef + B.t[j].coef;if (sum_coef != 0) {C.t[k].coef = sum_coef;C.t[k].exp = A.t[i].exp;k++;}i++; j++;}}while (i < A.n) C.t[k++] = A.t[i++];while (j < B.n) C.t[k++] = B.t[j++];C.n = k;return C;
}

完整代码

#include <stdio.h>
#include <stdlib.h>struct Term {int coef;int exp;
};struct Polynomial {int n;struct Term* t;
};struct Polynomial add(struct Polynomial A, struct Polynomial B) {struct Polynomial C;C.t = (struct Term*) malloc((A.n + B.n) * sizeof(struct Term));int i = 0, j = 0, k = 0;while (i < A.n && j < B.n) {if (A.t[i].exp > B.t[j].exp) {C.t[k++] = A.t[i++];} else if (A.t[i].exp < B.t[j].exp) {C.t[k++] = B.t[j++];} else {int sum_coef = A.t[i].coef + B.t[j].coef;if (sum_coef != 0) {C.t[k].coef = sum_coef;C.t[k].exp = A.t[i].exp;k++;}i++; j++;}}while (i < A.n) C.t[k++] = A.t[i++];while (j < B.n) C.t[k++] = B.t[j++];C.n = k;return C;
}void printPoly(struct Polynomial p) {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");
}int main() {struct Polynomial A, B, C;A.n = 3;B.n = 3;A.t = (struct Term*) malloc(A.n * sizeof(struct Term));B.t = (struct Term*) malloc(B.n * sizeof(struct Term));// A(x) = 3*x^4 + 2*x^2 + 7A.t[0] = (struct Term){3, 4};A.t[1] = (struct Term){2, 2};A.t[2] = (struct Term){7, 0};// B(x) = 5*x^3 + 2*x^2 + 1B.t[0] = (struct Term){5, 3};B.t[1] = (struct Term){2, 2};B.t[2] = (struct Term){1, 0};C = add(A, B);printf("A(x) = "); printPoly(A);printf("B(x) = "); printPoly(B);printf("C(x) = A(x) + B(x) = "); printPoly(C);free(A.t);free(B.t);free(C.t);return 0;
}
http://www.xdnf.cn/news/1221193.html

相关文章:

  • 【BUUCTF系列】[HCTF 2018]WarmUp1
  • 【科普】贝叶斯神经网络与分形神经网络
  • 基于deepseek的文本解析 - 超长文本的md结构化
  • 【neo4j】跨版本升级数据库
  • STM32——HAL 库MDK工程创建
  • 安全月报 | 傲盾DDoS攻击防御2025年7月简报
  • 微软发布Microsoft Sentinel数据湖国际版
  • Verilog与SytemVerilog差别
  • 【最近公共祖先】ST表法
  • Text2SQL 智能问答系统开发-预定义模板(二)
  • 内存网格、KV存储和Redis的概念、使用场景及异同
  • Flux.1系列模型解析--Flux.1
  • 无公网IP设置外网可访问本地瑞友天翼应用虚拟化系统
  • 分类-鸢尾花分类
  • RabbitMQ的特点和消息可靠性保障
  • 实时语音流分段识别技术解析:基于WebRTC VAD的智能分割策略
  • LeetCode 85:最大矩形
  • Linux 进程管理与计划任务
  • 代码随想录Day35:动态规划(背包问题 二维 一维、分割等和子集)
  • Dify 从入门到精通(第 6/100 篇):配置你的第一个 LLM:OpenAI、Claude 和 Ollama
  • 【刷题】东方博宜oj 1412-快速幂(零基础,简单易懂)
  • wpf之ContentPresenter
  • wxPython 实践(五)高级控件
  • 如何快速部署主数据管理解决方案?
  • 【MATLAB】(三)数据类型与运算符
  • 2025年财税行业拓客破局:小蓝本财税版AI拓客系统助力高效拓客
  • SpringBoot3.x入门到精通系列:1.1 简介与新特性
  • 8.1.1 不一样的kv存储RocksDB的使用场景
  • Excel文件解析
  • 《Java 程序设计》第 14 章 - JavaFX 基础