两个两个一元多项式相乘乘

使用链表实现两个多项式相加和相乘
设计函数分别求两个一元多项式的乘积与和。
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
4 3 4 -5 2
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.读入多项式1
2.读入多项式2
3.进行加法计算
4.实现乘法计算
5.输出乘法计算结果
6.输出加法计算结果
1.考虑如何读入多项式
在这之前我们需要确定链表节点的结构
需要有coef存储一项多项式的系数
需要有expon存储一项多项式的指数
需要有link存储下一个节点的地址
故构造数据类型
typedef struct PolyNode * P
struct PolyNode{
在此数据结构基础上,构造一个链表,采用尾插法,因此需要一个尾指针,如果没有尾指针,每次在向链表中加入一个节点时,都需要从头遍历。
同时再考虑一个问题,在向链表结尾插入结点时,如果链表为空,则申请一个新节点插入当前位置,同时让尾指针指向该节点;
如果链表不为空,则需要申请一个节点插入当前位置的后面,所以在进行插入时需要判断是否为空。
为了统一操作,我们可以申请一个带头节点链表,这样在插入时每次都插入尾节点的后面,统一了操作,当然,在链表读入完成之后需要free掉头节点。
下面是插入节点Attach函数和读取多项式ReadPoly函数:
void Attach(int c, int e, Polynomial * rear)//插入节点操作
Polynomial input = (Polynomial)malloc(sizeof(struct PolyNode));
//申请新节点并赋初值
input-&coef =
input-&expon =
input-&link = NULL;
(*rear)-&link =
*rear = //修改末尾指针,因为是修改指针,故此处使用指针的指针
Polynomial ReadPoly()
Polynomial P1, rear,
int N;//多项式项数
int c,e;//用来暂存系数和指数
P1 = (Polynomial)malloc(sizeof(struct PolyNode));//申请头节点
//申请头节点是为了方便使用Attach函数时,不用区分rear是空还是非空,有了头节点都是非空,插入方便
P1-&link = NULL;
rear = P1;//尾指针指向头节点
scanf("%d",&N);
while(N--)
scanf("%d %d",&c, &e);
Attach(c, e, &rear);
free(t);//头节点方便插入的使命完成,释放头节点
return P1;
}2.考虑如何进行多项式加法
首先传入两个多项式链表,申请一个链表存放相加的结果,依次取出两个多项式的节点
如果指数相等则相加,结果为零,释放该节点,不为零申请节点将加和结果存入节点,并将节点插入和多项式;
如果不相等,则把指数大的节点插入和多项式。
在一个链表计算完成之后若另一个链表还有节点,则将剩余节点全部插入和多项式
以下为加和函数:
Polynomial AddPoly(Polynomial P1, Polynomial P2)
Polynomial t1,t2,rear,t;
Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));
P-&link = NULL;
while(t1 && t2)
if(t1-&expon == t2-&expon)//如果指数相同则进行相加
if(t1-&coef + t2-&coef)//如果系数相加不为零,则将计算结果加入P中
Attach(t1-&coef + t2-&coef, t1-&expon, &rear);
else if(t1-&expon & t2-&expon)//找到指数大的加入到P中
Attach(t1-&coef, t1-&expon, &rear);
Attach(t2-&coef, t2-&expon, &rear);
while(t1)//如果t1还有多余节点,则继续加入
Attach(t1-&coef, t1-&expon, &rear);
while(t2)//如果t2还有多余节点,则继续加入
Attach(t2-&coef, t2-&expon, &rear);
free(t);//释放头节点
3.考虑如何进行多项式乘法
有两种方法进行乘法计算:
1.先拿第一个多项式的第一项乘以第二个多项式,生成一个多项式,将此生成的多项式作为基本,之后用第一个多项式的第二项依次乘以第二个多项式的每一项,每生成一项,将结果插入到之前生成的多项式中。(相当于插入项)
2.将第一个多项式的每一项与第二个多项式相乘,每次生成一个多项式,将这些多项式相加得结果。(相当于多个多项式加和)
此处采用第一种方法:
首先用第一个多项式的第一项乘以第二个多项式生成一个基本多项式,因为以后每生成一项要执行插入操作,而插入操作需要知道插入位置之前的节点,故每次判断
"尾指针-&link"是否和得到的乘积项的关系:
先将尾指针移动指数到不大于乘积项指数的前一项
若“尾指针-&link-&指数”与乘积项指数相同,则进行加法操作,若为零,删除节点;否则修改节点。
否则就是“尾指针-&link-&指数” & 乘积项指数,那么将乘积项插入到尾指针之后。
以下为乘法函数:
Polynomial MultyPoly(Polynomial P1, Polynomial P2)
Polynomial P, t1, t2, t,
P = (Polynomial)malloc(sizeof(struct PolyNode));
P-&link = NULL;
if(!t1 || !t2)//如果有一个多项式为空,则乘法结果为空
return NULL;
while(t2)//先用P1的第一项乘以P2生成一个多项式用于插入
c = t1-&coef * t2-&
e = t1-&expon + t2-&
Attach(c, e, &rear);
t1 = t1-&//t1指向第二项
t2 = P2;//将指针重新指向P2的开头
rear = P;//用作寻找合适的插入位置
c = t1-&coef * t2-&
e = t1-&expon + t2-&
while(rear-&link && rear-&link-&expon & e)//将rear指向指数与e相等或比e小的节点之前一个位置
rear = rear-&
if(rear-&link && rear-&link-&expon == e)//如果rear不为空且rear之后的节点指数和e相等,则进行相加
if(c + rear-&link-&coef)//如果相加不为0
rear-&link-&coef +=
rear = rear-&
else//相加结果为0 ,删除rear之后的节点
t = rear-&
rear-&link = t-&
else //构造一个新节点插入到rear之后
t = (Polynomial)malloc(sizeof(struct PolyNode));
t-&expon =
t-&link = rear-&
rear-&link =
rear = rear-&
free(t);//释放掉头节点
4.如何进行输出
输出比较容易:
void PrintPoly(Polynomial P)
int flag = 0;
printf("0 0\n");
printf(" ");
printf("%d %d",P-&coef, P-&expon);
printf("\n");
最后给出完整代码:
#include "stdio.h"
#include "stdlib.h"
1.首先要进行多项式的读入,构造函数ReadPoly()
2.进行多项式加法,构造函数AddPoly()
3.进行多项式乘法,构造函数MultyPoly()
4.进行多项式的输出,怕、PrintPoly()
typedef struct PolyNode * P
struct PolyNode{
void Attach(int c, int e, Polynomial * rear);//将新读入的系数和指数加到多项式的末尾
Polynomial ReadPoly();//读入多项式
Polynomial AddPoly(Polynomial P1, Polynomial P2);//计算两个多项式之和
Polynomial MultyPoly(Polynomial P1, Polynomial P2);//计算两个多项式积
void PrintPoly(Polynomial P);
int main()
Polynomial P1 = ReadPoly();
Polynomial P2 = ReadPoly();
Polynomial PA = AddPoly(P1, P2);
Polynomial PP = MultyPoly(P1, P2);
PrintPoly(PP);
PrintPoly(PA);
void Attach(int c, int e, Polynomial * rear)
Polynomial input = (Polynomial)malloc(sizeof(struct PolyNode));
//申请新节点并赋初值
input-&coef =
input-&expon =
input-&link = NULL;
(*rear)-&link =
*rear = //修改末尾指针,因为是修改指针,故此处使用指针的指针
Polynomial ReadPoly()
Polynomial P1, rear,
int N;//多项式项数
int c,e;//用来暂存系数和指数
P1 = (Polynomial)malloc(sizeof(struct PolyNode));//申请头节点
//申请头节点是为了方便使用Attach函数时,不用区分rear是空还是非空,有了头节点都是非空,插入方便
P1-&link = NULL;
rear = P1;//尾指针指向头节点
scanf("%d",&N);
while(N--)
scanf("%d %d",&c, &e);
Attach(c, e, &rear);
free(t);//头节点方便插入的使命完成,释放头节点
return P1;
Polynomial AddPoly(Polynomial P1, Polynomial P2)
Polynomial t1,t2,rear,t;
Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));
P-&link = NULL;
while(t1 && t2)
if(t1-&expon == t2-&expon)//如果指数相同则进行相加
if(t1-&coef + t2-&coef)//如果系数相加不为零,则将计算结果加入P中
Attach(t1-&coef + t2-&coef, t1-&expon, &rear);
else if(t1-&expon & t2-&expon)//找到指数大的加入到P中
Attach(t1-&coef, t1-&expon, &rear);
Attach(t2-&coef, t2-&expon, &rear);
while(t1)//如果t1还有多余节点,则继续加入
Attach(t1-&coef, t1-&expon, &rear);
while(t2)//如果t2还有多余节点,则继续加入
Attach(t2-&coef, t2-&expon, &rear);
free(t);//释放头节点
Polynomial MultyPoly(Polynomial P1, Polynomial P2)
Polynomial P, t1, t2, t,
P = (Polynomial)malloc(sizeof(struct PolyNode));
P-&link = NULL;
if(!t1 || !t2)//如果有一个多项式为空,则乘法结果为空
return NULL;
while(t2)//先用P1的第一项乘以P2生成一个多项式用于插入
c = t1-&coef * t2-&
e = t1-&expon + t2-&
Attach(c, e, &rear);
t1 = t1-&//t1指向第二项
t2 = P2;//将指针重新指向P2的开头
rear = P;//用作寻找合适的插入位置
c = t1-&coef * t2-&
e = t1-&expon + t2-&
while(rear-&link && rear-&link-&expon & e)//将rear指向指数与e相等或比e小的节点之前一个位置
rear = rear-&
if(rear-&link && rear-&link-&expon == e)//如果rear不为空且rear之后的节点指数和e相等,则进行相加
if(c + rear-&link-&coef)//如果相加不为0
rear-&link-&coef +=
rear = rear-&
else//相加结果为0 ,删除rear之后的节点
t = rear-&
rear-&link = t-&
else //构造一个新节点插入到rear之后
t = (Polynomial)malloc(sizeof(struct PolyNode));
t-&expon =
t-&link = rear-&
rear-&link =
rear = rear-&
free(t);//释放掉头节点
void PrintPoly(Polynomial P)
int flag = 0;
printf("0 0\n");
printf(" ");
printf("%d %d",P-&coef, P-&expon);
printf("\n");
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!多项式与多项式相乘测试题及答案
您现在的位置:&&>>&&>>&&>>&&>>&&>>&正文
多项式与多项式相乘测试题及答案
作者:佚名 资料来源:网络 点击数: &&&
多项式与多项式相乘测试题及答案
本资料为WORD文档,请点击下载地址下载
文 章来源莲山课件 w ww.5 y kj.Co m 13.2.3多项式与多项式相乘◆随堂检测1、(5b+2)(2b-1)=____________;(m-1)(m2+m+1)=________.2、2-(x+3)(x-1)=________________.(x+2y)2=_____________;(3a-2)(3a+2)=____________________.3、一个二项式与一个三项式相乘,在合并同类项之前,积的项数是(&&& )A、5项&&& B、6项&&&& C、7项&&&&& D、8项4、下列计算结果等于x3-y3的是(&&&&& )A& (x2-y2)(x-y)&& B& (x2+y2)(x-y)&& C& (x2+xy+y2)(x-y)&&& D& (x2-xy-y2)(x+y)5、计算:(& x+3)(2x2-4x+1)&&&&& 6、先化简,再求值x(x2-4)-(x+3)(x2-3x+2)-2x(x-2)其中x=& 。◆典例分析当x=2,y=1时,求代数式(x2-2y2)(x+2y)-2xy(x-y)的值。分析:先利用整式的法则进行运算,再进行加减运算,即合并同类项,最后代入求值。解:(x2-2y2)(x+2y)-2xy(x-y)=x3-2xy2+2x2y-4y3-2x2y+2xy2=x3-4y3.当x=2,y=1时原式=23-4×13=8-4=4◆课下作业●拓展提高1、若多项式(mx+8)(2-3x)展开后不含x项,则m=________。2、三个连续奇数,若中间一个为a,则他们的积为__________.3、如果(x-4)(x+8)=x2+mx+n,那么m、n的值分别是(&& )A. m= 4,n=32&&& B.m= 4,n=-32.&&& C. m= -4,n=32&&& D. m= -4,n= -324、若M、N分别是关于的7次多项式与5次多项式,则M•N(&&&& )A.一定是12次多项式&&&&&&&&&& B.一定是35次多项式C.一定是不高于12次的多项式&& D.无法确定其积的次数5、试说明:代数式(2x+3)(6x+2)-6x(2x+13)+8(7x+2)的值与x的取值无关.6、若(x2+nx+3)(x2-3x+m)的展开式中不含x2和x3项,求m、n的值.
&●体验中考
1、(2009年达州)若a-b=1,ab=-2,则(a+1)(b-1)=___________________.2.(2009年北京市)已知 ,求 的值&
参考答案:随堂练习1、10b2-b-2;& m3-1&& 2、5-x2-2x;&& x2+4xy+4y2;&&& 9a2-43、B.& 4、C. 5、x3+4x2- x+3& 6、原式=x3-4x- (x3-3x2+2x+3x2-9x+6) - (2x2-4x)= x3-4x-x3+3x2-2x-3x2+9x-6 -2x2+4x=-2x2+7x-6,把x= 代入结果为0课下作业拓展提高1、(mx+8)(2-3x)展开得-3mx2+(2m-24)x+16,由2m-24=0得m=122、a3-a&&& 3、(x-4)(x+8)=x2+4x-32,对照系数得m=4,n=-32.故选B& 4、7次多项式与5次多项式的最高次项分别为7次和5次,故M•N得最高次项的次数为12次,选A& 5、原式化简后为22,不含字母x,所以其值与x的取值无关。6、展开式中的x3项为(-3+n)x3,x2项为(m-3n+3)x2,由题意得-3+n=0, m-3n+3=0,所以m=6,n=3. 体验中考1、-4&&& 2、 = = = 当 时,原式=& 文 章来源莲山课件 w ww.5 y kj.Co m
没有相关试题上一个试题: 下一个试题:
? ? ? ? ? ? ? ? ? ?多项式的乘法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
多项式的乘法
&&多项式的乘法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
多项式与多项式相乘,其积仍是一个_积的次数等于两个多项式次数和
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
多项式的次数由幂项最高决定,两个多项式相乘后的次数自然等于两个次数之和.
为您推荐:
其他类似问题
扫描下载二维码用C语言设计程序实现多项式相乘的问题,1.多项式相乘:求两个多项式乘积的问题相信大家在中学时经常碰到,是这样一个问题:pa=an*x^n + an-1*x^(n-1) + … + a1*x + a0pa=bm*x^m + bn-1*x^(m-1) + … + b1*x + b0其中,an,an-1,…,a1,a0,bm,bm-1,… ,b1,b0 都是整数,范围[-].0
这个是母函数的知识,这一块我没怎么看,楼主可以自己百度一下.大概的意思就是:a[x]:x表示指数,a[x]存系数.如 3x^2+4x+5:可表示为:a[2]=3,a[1]=4,a[0]=5.多项式加减就是a[x]相加减.多项式相乘就是x相加.也就是下标的运算
可以用meshgrid,也可以用ezsurfa=3;b=1/5;x=0:0.1:1;y=0:0.01:0.15;[X,Y]=meshgrid(x,y);Z=-b*Y-a*X.*Y;surf(X,Y,Z),
已知椭圆x^2/2+y^2=1的左右焦点分别为F1、F2,过点F1斜率为1的直线交椭圆于P、Q两点,求弦长|PQ|.讲的稍微仔细些,对哩,弦长公式是什么?这个老师没说.
椭圆方程变为:x^2+2y^2-2=0,(1)c=√(a^2-b^2)=1,左焦点坐标F1(-1,0),PQ方程:y=x+1,代入(1)式,x^2+2(x+1)^2-2=0,3x^2+4x=0,根据韦达定理,x1+x2=-4/3,x1x2=0,|PQ|=√[(1+k^2)(x1-x2)^2]=√(1+1^2)[(x1+x2)-4x1x2]=√2*[(-4/3)^2-0]∴|PQ|=4√2/3. 可以用经过焦点弦长公式,|PQ|=(2b^2/a)/[1-e^2(cosθ)^2]b=1,a=√2,e=√2/2,cosθ=√2/2,代入公式,|PQ|=2/(√2)/[1-(1/2)*(1/2)]=√2/(1-1/4)=4√2/3.
其他相关问题

我要回帖

更多关于 多项式相乘的公式 的文章

 

随机推荐