一元多项式的乘法与加法运算

article/2025/8/15 9:10:17

题目要求

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

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

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

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

题意分析

在这里插入图片描述
求解思路

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

多项式表示

数组:编程简单、调试容易;但需要事先确定数组的大小。(可以采用动态数组)
链表:动态性强;编程较为复杂,调试比较困难。(本题用链表表示)

用链表表示:数据域包括系数和指数,指针域指向下一个节点。
在这里插入图片描述

程序框架

main()函数中包括

  1. 读入多相式1
  2. 读入多相式2
  3. 乘法运算并输出
  4. 加法运算并输出
  5. return 0;

因此需要设计的函数有:

  1. 读一个多相式
  2. 两多项式相乘
  3. 两多相式相加
  4. 多相式输出

主函数代码用C语言表示如下:

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;
}

读多项式

ReadPoly()
读入多相式的基本框架是这样的
在这里插入图片描述
读入之后链表为:
在这里插入图片描述
对于每一项,需要将它接到原来的链表之后,就需要再定义一个函数Attach,方便读入多相式。
Rear的初值有两种定义方法:

  1. Rear初值为NULL,在Attach函数中根据Rear是否为NULL做不同处理。
    在这里插入图片描述
  2. Rear指向一个空结点
    在这里插入图片描述
    这种方法要注意的是最后要释放掉头结点。

Attach()
在这里插入图片描述

加法实现

在这里插入图片描述
算法思路:
两个指针 P1 和 P2 分别指向这两个多相式的第一个结点,不断循环:

  1. P1->expon = P2->expon : 系数相加,如果结果不等于 0 , 那么作为结果的多项式对应项的系数。同时,P1和P2都指向下一项。
  2. P1->expon > P2->expon : 把P1的当前项存入结果多相式,并使P1指向下一项。
  3. P1->expon < P2->expon : 把P2的当前项存入结果多相式,并使P2指向下一项。

当某一多相式处理完的时候,将另一多项式党的所有结点依次复制到结果多项式。

在这里插入图片描述

乘法实现

方法
在这里插入图片描述

输出多项式

题目中最后的输出每个系数和指数之间是带空格的,而开始没有空格。所以这里设立一个flag,用作输出标记。

void PrintPoly(Polynomial P)
{/* 输出多项式 */int flag = 0; //辅助调整输出格式if (!P){printf("0 0\n");return;}while (P){if (!flag)flag = 1;elseprintf(" ");printf("%d %d", P->coef, P->expon);P = P->link;}printf("\n");
}

完整代码

C语言:

#include <stdio.h>
#include <stdlib.h>struct PolyNode
{int coef;int expon;struct PolyNode* link;
};
typedef struct PolyNode* Polynomial;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值 */*pRear = P;
}Polynomial ReadPoly()
{Polynomial P, Rear, t;int c, e, n;/* 链表头空结点 */P = (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL;Rear = P;scanf("%d", &n);while (n--){scanf("%d %d", &c, &e);/* 将当前的项插入多相式的尾部 */Attach(c, e, &Rear);}/* 删除临时生成的头结点 */t = P; P = P->link;free(t);return P;
}int Compare(int a, int b)
{if (a > b)return 1;else if (a < b)return -1;elsereturn 0;
}Polynomial Add(Polynomial P1, Polynomial P2)
{Polynomial front, rear, temp;int sum;rear = (Polynomial)malloc(sizeof(struct PolyNode));front = rear; /* front记录结果多项式链表头结点 *//* 当两个多项式都有非零项待处理 */while (P1 && P2){switch (Compare(P1->expon, P2->expon)){case 1:  //P1 指数 更大Attach(P1->coef, P1->expon, &rear);P1 = P1->link;break;case -1: //P2 指数 更大Attach(P2->coef, P2->expon, &rear);P2 = P2->link;break;case 0:  //指数相等sum = P1->coef + P2->coef;if (sum)Attach(sum, P1->expon, &rear);P1 = P1->link;P2 = P2->link;break;}}/* 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去 */while (P1){Attach(P1->coef, P1->expon, &rear);P1 = P1->link;}while (P2){Attach(P2->coef, P2->expon, &rear);P2 = P2->link;}rear->link = NULL;/* 令front指向结果多项式的第一个非零项 */temp = front;front = front->link;free(temp);return front;
}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;/* 先用P1的第一项乘以P2,得到P */while (t2){/* 先用P1的第一项乘以P2,得到P2 */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;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;
}void PrintPoly(Polynomial P)
{/* 输出多项式 */int flag = 0; //辅助调整输出格式if (!P){printf("0 0\n");return;}while (P){if (!flag)flag = 1;elseprintf(" ");printf("%d %d", P->coef, P->expon);P = P->link;}printf("\n");
}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;
}

在这里插入图片描述
过啦~~~超级开心呐!


http://chatgpt.dhexx.cn/article/F0qpIMTH.shtml

相关文章

多项式乘法运算初级版

快速傅里叶变换在信息学竞赛中主要用于求卷积&#xff0c;或者说多项式乘法。我们知道&#xff0c;多项式乘法的普通算法时间复杂度 是&#xff0c;通过快速傅里叶变换可以使时间降为&#xff0c;那么接下来会详细介绍快速傅里叶变换的原理。 首先来介绍多项式的两种表示方法&…

FFT与多项式乘法

网上关于FFT在信号处理中应用的文章并不少&#xff0c;这里尽量少说废话&#xff0c;直接说如何用FFT实现多项式乘法。 多项式乘法&#xff0c;通常是用系数乘积的方式完成&#xff0c;这样的时间复杂度是O(n^2) n为多项式项数。系数乘法可以满足大多数的乘法需求&#xff0c;然…

多项式乘法

实验题目&#xff1a;多项式乘法问题 实验内容与要求 一元稀疏多项式简单计算器的基本功能是&#xff1a; &#xff08;1)输入并建立多项式。&#xff1b; &#xff08;2&#xff09;输出多项式&#xff0c;输出形式为整数序列&#xff1a;n,c1,e1,c2,e2,…,cn,en,其中n是多项…

多项式乘法运算终极版

在上一篇文章中 http://blog.csdn.net/acdreamers/article/details/39005227 介绍了用快速傅里叶变 换来求多项式的乘法。可以发现它是利用了单位复根的特殊性质&#xff0c;大大减少了运算&#xff0c;但是这种做法是对复数系数的矩阵 加以处理&#xff0c;每个复数系数的实…

多项式乘法(FFT)

1 前言 作为一名OI选手&#xff0c;至今未写过fft相关的博客&#xff0c;真是一大遗憾&#xff0c;这也导致我并没有真正推过fft的所有式子 这一篇fft的博客我将详细介绍多项式乘法&#xff0c;易于理解&#xff0c;主要是为了等我啥时候忘了回来看&#xff0c;当然&#xff0…

分治算法-03多项式乘法问题

多项式乘法 简介 多项式的运算表示是一个很常见的算法问题。 问题描述 给予两个多项式A(x)与B(x)&#xff0c;得出C(x)A(x)B(x)。例如&#xff0c;A(x)32x3x24x3&#xff0c;B(x)2x2&#xff0c;C(x)64x9x210x33x44x^5。 问题分析 一般情况下&#xff0c;使用系数表示多项式&a…

【数据结构】——多项式乘法

题目要求 从字符文件输入两个多项式的非零系数及对应的指数&#xff0c;建立多项式的链式存储结构&#xff0c;计算这两个多项式的乘积&#xff0c;输出乘积多项式的全部非零系数及对应的指数到另一字符文件中。 算法原理 两个多项式的乘法&#xff0c;可以借助两个多项式的…

多项式乘法(FFT)详解

本文只探讨多项式乘法(FFT)在信息学中的应用 如有错误或不明欢迎指出或提问&#xff0c;在此不胜感激 多项式 1. 系数表示法 一般应用最广泛的表示方式 用A(x)表示一个x-1次多项式&#xff0c;a[i]为 xi x i 的系数&#xff0c;则A(x) ∑n−10 ∑ 0 n − 1 a[i] * xi x i…

2.2 多项式乘法与加法运算(线性结构,C)

多项式乘法与加法运算 设计函数分别求两个一元多项式的乘积与和题意理解题意理解和积 求解思路多项式表示两种表示方式在事先已经知道具体多少项的时候&#xff0c;本题较好的实现方法&#xff1a;动态数组链表表示多项式的方法 程序框架如何读入多项式读入多项式的完整程序 加…

多项式乘法问题

多项式乘法问题 实验目的&#xff1a;设计一个一元稀疏多项式简单计算器。 实验内容与要求&#xff1a; 一元稀疏多项式简单计算器的基本功能是&#xff1a; &#xff08;1&#xff09;输入并建立多项式&#xff1b; &#xff08;2&#xff09;输出多项式&#xff0c;序列…

网络协议之视频直播核心技术讲解

网络视频直播存在已有很长一段时间&#xff0c;随着移动上下行带宽提升及资费的下调&#xff0c;视频直播被赋予了更多娱乐和社交的属性&#xff0c;人们享受随时随地进行直播和观看&#xff0c;直播的打开时间和延迟变成了影响产品功能发展重要指标。 那么&#xff0c;问题来了…

直播软件搭建技术原理:CDN 与直播

直播软件搭建技术原理&#xff1a;CDN 与直播 很多直播都是基于 CDN 来实现的。而通过声网的服务&#xff0c;或基于声网SDK与 CDN 结合&#xff0c;还可以实现在直播中的连麦互动、白板同步等强调实时性的场景。本文源自社区投稿&#xff0c;介绍了该场景下的一些基础知识。如…

暑期实习+秋招面经合集(更新ing)

大纲 开篇 自我介绍 &#xff1a;面试官你好&#xff0c;我叫林飞武&#xff0c;是一名通信工程大三学生&#xff0c;对计算机专业有着浓厚兴趣并且未来有志于在互联网的测试领域有深入发展。全套学习了计算机专业的专业课&#xff0c;计算机网络&#xff0c;操作系统等&#…

DNSPod十问王征:为什么你的网站无人问津?

&#x1f4e2; DNSPod十八周年庆将至&#xff0c;下期十问交给你来提问——《你&#xff0c;十问DNSPod》&#xff01;评论区留下你想问DNSPod团队的问题&#xff0c;一旦提问被选中&#xff0c;将得到十八周年纪念T恤&#xff01;详情请移步至DNSPod公众号十八周年庆推送。 广…

阿里云ACP认证考试笔记

课件&#xff1a;https://gitee.com/HanFerm/technical-documentation/tree/master/阿里云acp教材 本文档为公开内容 一、ACP是干嘛的 内容范围&#xff1a; 历史 二、阿里云综述 技术架构 优势 三、弹性计算 ECS ECS的组成与功能 ECS是由多个并列又相互关联的产品概念组成…

在互联网上,没有人知道你是一条狗?

1993 年&#xff0c;《纽约客》&#xff08;The New Yorker&#xff09;杂志刊登一则由彼得施泰纳&#xff08;Peter Steiner&#xff09;创作的漫画&#xff1a;标题是【On the Internet, nobody knows you’re a dog.】 这则漫画中有两只狗&#xff1a;一只黑狗站在电脑椅上…

分库分表和NewSQL如何选择?分库分表真的适合你的系统吗?

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表不一定适合你的系统,聊聊分库分表和NewSQL如何选择

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表真的适合你的系统吗?聊聊分库分表和NewSQL如何选择

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表和 NewSQL 到底怎么选?

文章来源&#xff1a;【公众号&#xff1a;CoderW】 目录 背景分表分库分库分表的成本NewSQLNewSQL 平滑接入方案NewSQL 真的有那么好吗&#xff1f;NewSQL 的应用分库分表和 NewSQL 到底怎么选&#xff1f; 背景 曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”…