当前位置: 首页 > 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.lryc.cn/news/605670.html

相关文章:

  • Linux多线程线程控制
  • PHP开发
  • 《质光相济:Three.js中3D视觉的底层交互逻辑》
  • Redis高频问题全解析
  • 深度理解 linux 系统内存分配
  • [特殊字符] 数字孪生 + 数据可视化:实战经验分享,让物理世界数据 “会说话”
  • Java【代码 21】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
  • ubuntu24.04环境下树莓派Pico C/C++ SDK开发环境折腾记录
  • STM32学习记录--Day4
  • 云原生运维与混合云运维:如何选择及 Wisdom SSH 的应用
  • AI编程新工具!使用 LangGraph 构建复杂工作流
  • Cesium 快速入门(七)材质详解
  • 数据结构 ArrayList与顺序表
  • 计算机网络学习(一、Cisco Packet Tracer软件安装)
  • Redis线程模型讨论
  • 无人机飞控系统3D (C++)实践
  • 思途JSP学习 0731
  • Druid数据库连接池
  • MongoDB系列教程-第四章:MongoDB Compass可视化和管理MongoDB数据库
  • 使用 Elasticsearch 和 AI 构建智能重复项检测
  • Jmeter 命令行压测、HTML 报告、Jenkins 配置目录
  • HTML-取消div,a等标签点击效果
  • 深入探索Weaviate:构建高效AI应用的数据库解决方案
  • 常用设计模式系列(十七)—命令模式
  • LCM中间件入门(2):LCM核心实现原理解析
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • [算法]Leetcode3487
  • Video_1920×1080i 1920_1080p
  • 大白话解释---FreeRTOS中的队列集
  • 基于知识驱动的解释性条件扩散模型用于无对比剂心肌梗死增强合成|文献速递-医学影像算法文献分享