一、题意理解

设计函数分别求两个一元多项式的乘积与和,例:

\[\text{已知以下两个多项式:} \\
\begin{align}
& 3x^4-5x^2+6x-2 \\
& 5x^{20}-7x^4+3x
\end{align}
\]

\[\text{多项式和为:} \\
\begin{align}
5x^{20}-4x^4-5x^2+9x-2
\end{align}
\]

假设多项式的乘积为\((a+b)(c+d)=ac+ad+bc+bd\),则多项式的乘积如下:

\[\begin{align}
15x^{24}-25x^{22}+30x^{21}-10x^{20}-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x
\end{align}
\]

通过上述题意理解,我们可以设计函数分别求两个一元多项式的乘积与和。

输入样例:

\[\begin{align}
& 3x^4-5x^2+6x-2 \quad --> \quad \text{4个}\,3\,4\,-5\,2\,6\,1\,-2\,0 \\
& 5x^{20}-7x^4+3x \quad --> \quad \text{3个}\,5\,20\,-7\,4\,3\,1 \\
\end{align} \\
\]

输出样例:

\[\begin{align}
& 15x^{24}-25x^{22}+30x^{21}-10x^{20}-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x \\
& 15 \, 24 \, -25 \, 22 \, 30 \, 21 \, -10 \, 20 \, -21 \, 8 \, 35 \, 6 \, -33 \, 5 \, 14 \, 4 \, -15 \, 3 \, 18 \, 2 \, -6 \, 1 \, 5 \, 20 \, -4 \, 4 \, -5 \, 2 \, 9 \, 1 \, -2 \, 0
\end{align}
\]

二、求解思路

  1. 多项式表示
  2. 程序框架
  3. 读多项式
  4. 加法实现
  5. 乘法实现
  6. 多项式输出

三、多项式的表示

仅表示非零项

3.1 数组

优点:编程简单、调试简单

缺点:需要事先确定数组大小

一种比较好的实现方法是:动态数组(动态更改数组的大小)

3.2 链表

优点:动态性强

缺点:编程略为复杂、调试比较困难

数据结构设计:

/* c语言实现 */

typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
}

四、程序框架搭建

/* c语言实现 */

int main()
{
读入多项式1;
读入多项式2;
乘法运算并输出;
加法运算并输出;
return 0;
} int main()
{
Polynomial P1, P2, PP, PS; P1 = ReadPoly();
P2 = ReadPoly();
PP = Mult(P1, P2);
PrintPoly(PP);
PS = Add(P1, P2);
PrintPoly(PS); return 0;
}

需要设计的函数:

  • 读一个多项式
  • 两多项式相乘
  • 两多项式相加
  • 多项式输出

五、如何读入多项式

/* c语言实现 */

Polynomial ReadPoly()
{
...;
scanf("%d", &N);
...;
while (N--) {
scanf("%d %d", &c, &e);
Attach(c, e, &Rear);
}
...;
return P;
}

Rear初值是多少?

两种处理方法:

  1. Rear初值为NULL:在Attach函数中根据Rear是否为NULL做不同处理

  1. Rear指向一个空结点

/* c语言实现 */

void Attach(int c, int e, Polynomial *pRear)
{
Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode));
p->coef = c; /* 对新结点赋值 */
p->expon = e;
p->link = NULL;
(*pRear)->link = P;
(*pRear) = P; /* 修改pRear值 */

/* c语言实现 */

Polynomial ReadPoly()
{
Polynomial P, Rear, t;
int c, e, N; scanf("%d", &N);
P = (Polynomial)malloc(sizeof(struct PolyNode)); // 链表头空结点
P->link = NULL;
Rear = P;
while (N--) {
scanf("%d %d", &c, &e);
Attach(c, e, &Rear); // 将当前项插入多项式尾部
}
t = P; P = P->link; free(t); // 删除临时生成的头结点
return P;
}

六、如何将两个多项式相加

/* c语言实现 */

Polynomial Add(Polynomial P1, Polynomial P2)
{
...;
t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while (t1 && t2){
if (t1->expon == t2->expon){
...;
}
else if (t1->expon > t2->expon){
...;
}
else{
...;
}
}
while (t1){
...;
}
while (t2){
...;
}
...;
return P;
}

七、如何将两个多项式相乘

方法:

  1. 将乘法运算转换为加法运算

将P1当前项(ci, ei)乘P2多项式,再加到结果多项式里

/* c语言实现 */

t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode)); P->link = NULL;
Rear = P;
while (t2){
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
}
  1. 逐项插入

将P1当前项(c1_i, e1_i)乘P2当前项(c2_i, e2_i),并插入到结果多项式中。关键是要找到插入位置

初始结果多项式可由P1第一项乘P2获得(如上)

/* c语言实现 */

Polynomial Mult(Polynomial P1, Polynomial P2)
{
...;
t1 = P1; t2 = P2;
...;
while (t2){ // 先用P1的第一项乘以P2,得到P
...;
}
t1 = t1->link;
while (t1){
t2 = P2; Rear = P;
while (t2){
e = t1->expon + t2->expon;
c = t1->coef * t2->coef;
...;
t2 = t2->link;
}
t1 = t1->link;
}
...;
}
/* c语言实现 */

Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNOde)); P->link = NULL;
Rear = P;
while (t2){ // 先用P1的第一项乘以P2,得到P
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
} t1 = t1->link;
while (t1){
t2 = P2; Rear = P;
while (t2){
e = t1->expon + t2->expon;
c = t1->coef * t2->coef;
...;
t2 = t2->link;
}
t1 = t1->link;
}
...;
}

/* c语言实现 */

Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNOde)); P->link = NULL;
Rear = P;
while (t2){ // 先用P1的第一项乘以P2,得到P
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
} t1 = t1->link;
while (t1) {
t2 = P2; Rear = P;
while (t2) {
e = t1->expon + t2->expon;
c = t2->coef * t2->coef;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e){
...;
}
else{
...;
}
t2 = t2->link;
}
t1 = t1->link;
}
...;
}

/* c语言实现 */

Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNOde)); P->link = NULL;
Rear = P;
while (t2){ // 先用P1的第一项乘以P2,得到P
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
} t1 = t1->link;
while (t1) {
t2 = P2; Rear = P;
while (t2) {
e = t1->expon + t2->expon;
c = t2->coef * t2->coef;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e){
if (Rear->link->coef + c)
Rear->link->coef += c;
else{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c; t->expon = e;
t->link = Rear->link;
Rear->link = t; Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
...;
}

/* c语言实现 */

Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNOde)); P->link = NULL;
Rear = P;
while (t2){ // 先用P1的第一项乘以P2,得到P
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
} t1 = t1->link;
while (t1) {
t2 = P2; Rear = P;
while (t2) {
e = t1->expon + t2->expon;
c = t2->coef * t2->coef;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e){
if (Rear->link->coef + c)
Rear->link->coef += c;
else{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c; t->expon = e;
t->link = Rear->link;
Rear->link = t; Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P; P = P->link; free(t2);
return P;
}

八、如何将多项式输出

/* c语言实现 */

void PrintPoly(Polynomial P)
{
// 输出多项式
int flag = 0; // 辅助调整输出格式用,判断输出加法还是乘法 if (!P) {printf("0 0\n"); return ;} while (P) {
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", P->coef, P->expon);
P = P->link;
}
printf("\n");
}

小白专场-多项式乘法与加法运算-c语言实现的更多相关文章

  1. 小白专场-多项式乘法与加法运算-python语言实现

    目录 题意理解 解题思路 多项式加法 多项式乘法 完整代码 题意理解 题目: 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一 ...

  2. 一元多项式的乘法与加法运算(C语言)

    输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方 ...

  3. 线性结构2 一元多项式的乘法与加法运算 【STL】

    02-线性结构2 一元多项式的乘法与加法运算(20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和 ...

  4. PTA 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    原题地址 https://pta.patest.cn/pta/test/15/exam/4/question/710 5-2 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的 ...

  5. PTA数据结构 习题3.6 一元多项式的乘法与加法运算 (20分)

    一元多项式的乘法与加法运算 https://pintia.cn/problem-sets/434/problems/5865 设计函数分别求两个一元多项式的乘积与和. 时间限制:200 ms 内存限制 ...

  6. PAT 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  7. 线性结构CT 02-线性结构1 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  8. 浙江大学PAT上机题解析之3-04. 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分 ...

  9. 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-04 设计函数分别求两个一元多项式的乘积与和. 输入格式说明: 输入分2行.每行分别先给出多项式非零项的个数.再以指数 ...

随机推荐

  1. C语言数据类型及变量整理

    数据类型 获取int的字节数大小方法 printf("int bytes:%d",sizeof(int)); 列表整理 类型 字节数 取值范围 char 1 [-128,127]= ...

  2. 前端jQuery学习(一)

    把最近学习的前端框架jQuery整理一下.你可能听说过jQuery,因为他是JavaScript世界中使用最广泛的一个库. 江湖传言,全世界大约有80~90%的网站直接或间接地使用了jQuery.鉴于 ...

  3. 172. 阶乘后的零 Java解法

    https://leetcode-cn.com/problems/factorial-trailing-zeroes/ 172. 阶乘后的零 这题要完成其实要知道一个很巧妙的思想,就是阶乘里面,后面的 ...

  4. MyBatis 文档 完整版

    框架技术 1.框架技术 01.是一个应用程序的半成品 02.提供可重用的公共结构 03.按一定规则组织的一组组件 2.分析优势 01.不用再考虑公共问题 02.专心的业务实现上 03.结构统一,易于学 ...

  5. PHP7安装mysql扩展

    1.下载mysql扩展 http://git.php.net/?p=pecl/database/mysql.git;a=summary 2.解压后并使用phpize工具初始化(phpize一般在php ...

  6. Anaconda大法好,为什么要用Anaconda(附linux安装与用例)

    距离写上一个博客已经过去很久了,注册的时候我还是个大三学生抱着windows系统的visual studio在OPENCV等等复杂组件下面瑟瑟发抖,一不小心就担心hpp找不到了,依赖库没了,或者安装了 ...

  7. 让Controller支持对平铺参数执行@Valid数据校验

    每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JS ...

  8. Eclipse "Adb failed to restart !"

    今天遇到这个问题,如图所示: 上网找了下,原来是电脑上的各种手机助手抢占了手机链接.http://blog.csdn.net/zhufuing/article/details/19398125 说得很 ...

  9. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    目录 一. 需求描述 二. 预备知识 IP+端口访问 域名访问 三. Nodejs应用的手动部署 四. 基于nodejs的自动部署 4.1 package.json中的scripts 4.2 自动化发 ...

  10. 用多线程优化Excel表格数据导入校验的接口

    公司的需求,当前某个Excel导入功能,流程是:读取Excel数据,传入后台校验每一条数据,判断是否符合导入要求,返回给前端,导入预览展示.(前端等待响应,难点).用户再点击导入按钮,进行异步导入(前 ...