一元多项式相家问题
第1关:基于链表的两个一元多项式的基本运算
第1关:基于链表的两个一元多项式的基本运算在计算机科学中,一元多项式是常见的代数表达式形式,通常用来表示多项式函数。
虽然一元多项式的计算看似简单,但如果使用数据结构来实现,将会大大提高计算效率。
这篇文档将详细介绍基于链表的两个一元多项式的基本运算。
一元多项式的定义:在代数学中,一元多项式是一种含有一个未知数的代数多项式。
它是指一个代数式,它是由保持仅仅又有限个多项式的乘积。
此外,一元多项式在基本运算方面具有封闭性,这也是为什么它被广泛应用的原因之一。
在这里,我们将讨论在计算机科学中对一元多项式的实现。
链表的定义:链表是一种线性数据结构,其中数据元素不是常规的数组索引组织,而是通过信息存储元素之间的链来相互连接。
每个元素被称为节点,并且每个节点包含一个下一个节点的指针。
基于链表的一元多项式的实现:基于链表的一元多项式的实现涉及到将每个多项式的系数和指数存储为链表中的节点。
这种实现的主要优点是,它可以轻松地进行添加和删除操作,可以有效地分配内存,而不会浪费存储空间。
考虑到一元多项式的基本运算包括加法,减法和乘法,我们将详细介绍每种操作的实现。
一、基于链表的两个一元多项式的加法操作在实现一元多项式加法时,我们需要创建两个链表来存储两个多项式。
链表节点应该包含两个属性:系数和指数。
然后我们可以使用以下方法将两个多项式相加。
1. 定义两个指针p1和p2分别指向多项式链表的头部。
2. 定义一个新链表,用于存储相加的项。
3. 当p1和p2都不为空时循环进行以下操作:a. 如果p1当前节点的指数小于p2当前节点的指数,则将p1的节点添加到新链表中并将p1指针向下移动一个节点。
b. 如果p1当前节点的指数大于p2当前节点的指数,则将p2的节点添加到新链表中并将p2指针向下移动一个节点。
c. 如果p1和p2当前节点的指数相等,则将两个节点的系数相加,并将结果添加到新链表中,并将p1和p2指针都向下移动一个节点。
的所有剩余项添加到新链表中。
一元多项式的求和
一元多项式的求和一元多项式的求和是数学中常见的问题,它涉及到对一元多项式中的各项进行求和运算,是代数学中的重要概念之一。
本文将介绍一元多项式的求和的基本概念、方法和应用。
一元多项式是指仅含有一个未知数的多项式,它由若干个单项式相加或相减而成。
每个单项式由系数和次数两部分组成,其中系数可以是实数、复数或其他数域中的元素,次数为非负整数。
一元多项式的一般形式可以表示为:P(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0其中,P(x)表示一元多项式,a_n, a_{n-1}, ..., a_1, a_0为系数,x为未知数,n为最高次数。
一元多项式的求和即是对多项式中各项的系数进行求和运算。
具体来说,就是将各项的系数相加得到一个结果。
例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以将其系数相加得到求和结果为:2 + (-5) +3 + (-1) = -1这就是该一元多项式的求和结果。
对于一元多项式的求和,可以应用代数学中的求和公式或方法进行计算。
常见的求和方法包括直接相加法、分组求和法和利用求和公式法。
直接相加法是最简单直观的求和方法,即将各项的系数直接相加。
这种方法适用于项数较少或系数较简单的一元多项式。
例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以直接相加得到求和结果为:2 + (-5) +3 + (-1) = -1分组求和法是将一元多项式中的各项按照次数进行分组,然后对每组的系数进行求和。
这种方法适用于项数较多或系数较复杂的一元多项式。
例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以按次数分组得到:2x^3 + (-5x^2) + 3x + (-1)然后对每组的系数进行求和,得到求和结果为:2 + (-5) +3 + (-1) = -1利用求和公式法是根据一元多项式的特点,利用求和公式进行计算。
一元多项式相加问题实验报告
一元多项式相加问题实验报告一元多项式相加问题一、问题描述通过键盘输入两个形如P 0 +P 1 X 1 +P 2 X 2 +…+P n X 的多项式,经过程序运后在屏幕上输出它们的相加和。
二、数据结构设计一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此可将其抽象为包含系数coef、指数exp、指针域next 构成的链式线性表。
将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成新的线性表,期间可以将某些不需要的空间回收。
基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。
具体数据类型定义为:struct node {float coef;//系数域int exp;//指数域struct node *next; }; 三、功能函数设计1、输入多项式的系数和指数初始化多项式的功能模块具体函数为node *in_fun() 此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0 的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入。
关键步骤具体如下:⑴控制用户按照指数递增的顺序输入r=a; while(r!=q-next){if(y=r-exp){cout“请按照指数递增顺序输入,请重新输入“;cinxy;break;}r=r-next;} 从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重新输入。
⑵当输入的系数为零时,不为其分配存储空间存储while(x==0) { cinxy; continue;} 即若系数为0,不再进行动态分配并新建结点,而是重新提取用户输入的下一个子项的系数和指数,利用continue 进入下一次循环。
⑶初始化完成后将最后一个结点的指针域置为空,并返回该新建链表的首地址。
if(q!=NULL)q-next=NULL;return a; ⑷动态分配空间新建结点存储系数和指数的代码如下:p=new node;p-coef=x;p-exp=y;if(a==NULL) a=p;else q-next=p;q=p; 2、多项式显示功能函数由于系数有正有负,故采取如下处理:对于正数,输出时在前面加“+”,头指针除外;对于负数,直接将系数输出即可,即:p=a;while(p){if(p==a)coutp-coef"*x^"p-else if(p-coef0)coutp-coef"*x^"p-else if(p-coef0)cout"+"p-coef"*x^"p-p=p-next;} 输出的多项式的形式形如:P 1 X^1+P 2 X^2+…+P n X^n 3、多项式相加的功能函数函数为:node *plus_fun(node *a,node *b) 此函数根据在 1 中初始化的两个多项式进行相加运算,并存放在以c 为头指针的一个新链表中。
一元多项式计算(数据结构课程设计)
一元多项式计算(数据结构课程设计)一、系统设计1、算法思想根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。
因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。
为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。
主要用到了单链表的插入和删除操作。
(1)一元多项式加法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。
P 的指数小于q的指数的话就应该复制q的节点到多项式中。
P的指数大于q的指数的话,就应该复制p节点到多项式中。
当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。
当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。
(2)一元多项式的减法运算它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。
p的指数小于q的指数的话,就应该复制q的节点到多项式中。
P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。
当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。
2、概要设计(1)主函数流程图:(注:a代表第一个一元二次方程,b代表第二个一元二次方程)(2)一元多项式计算算法用类C语言表示:Typedef struct00{ //项的表示,多项式的项作为LinkList的数据元素Float coef;//细数Int expn;//指数}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名Typedef LinkList polynomial://用带表头的节点的有序链表表示多项式//基本操作的函数原型说明Void CreatePolyn(polynomail&P);//输入n的系数和指数,建立表示一元多项式的有序链表P 销毁一元多项式P Void DestroyPolyn(polynomailP);销毁一元多项式PvoidPrintPoly(polynomail P);//打印输入一元多项式PIntPolynLength(polynnomail P);//返回一元多项式P中的项数void CreatPolyn(polynomail&Pa.polunomail&Pb);//完成多项式相加运算,即:Pa=Pa+Pb,并贤惠一元多项式Pb voidSubtractPolyn(polunomail&Papolunomail&Pb);//完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb//基本操作的算法描述Int cmp(tem a,temp b);//依a的指数值<(或=)(或>b的住数值,分别返回-1、0和+1Void CreatePolyn(polynomail&P,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表PInitList(P);h=GetHead(P);E.coef=0.0; e.expn=-1;S erCurElem(h,e);//设置头结点的数据元素For (i=1;i<=m;++i){ //依次输入m个非零项Scanf(e.coef,e.epn);If(!LocateElem(P,e,q,(*cmp)())){//当前链表中不存在该指数项If(MakeNode(s,e))InsFirst(q,s);//生成节点并插入链表}}}//CreatPolun二、详细设计1、算法实现(1)输入一元多项式函数:void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");}(2)加法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}(3)减法函数/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}2、程序代码/*一元多项式计算*//*程序功能:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;*//*提示:输入完一元多项式之后,输入“0 0”结束本一元多项式的输入*//*注意:系数只精确到百分位,最大系数只能为999.99,指数为整数.如果需要输入更大的系数,可以对程序中5.2%f进行相应的修改*/#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<conio.h>/*建立结构体*/typedef struct pnode{float xishu; /*系数*/int zhishu; /*指数*/struct pnode *next; /*下一个指针*/}pnode;/*用头插法生成一个多项式,系数和指数输入0时退出输入*/pnode * creat()int m;float n;pnode *head,*rear,*s; /*head为头指针,rear和s为临时指针*/ head=(pnode *)malloc(sizeof(pnode));rear=head; /*指向头*/scanf("%f",&n); /*系数*/scanf("%d",&m); /*输入指数*/while(n!=0) /*输入0退出*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=n;s->zhishu=m;s->next=NULL;rear->next=s; /*头插法*/rear=s;scanf("%f",&n); /*输入系数*/scanf("%d",&m); /*输入指数*/}head=head->next; /*第一个头没有用到*/return head;}/*调整多项式*/void tiaozhen(pnode *head){pnode *p,*q,*t;float temp;p=head;while(p!=NULL){q=p;t=q->next;while(t!=NULL){if(t->zhishu>q->zhishu)q=t;t=t->next;}temp=p->xishu;p->xishu=q->xishu;q->xishu=temp;temp=p->zhishu;p->zhishu=q->zhishu;q->zhishu=temp;p=p->next;}/*显示一个多项式*/void shuchu(pnode *head){pnode *p;int one_time=1;p=head;while(p!=NULL) /*如果不为空*/{if(one_time==1){if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/printf("%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/else if(p->xishu==1||p->xishu==-1)printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*//*如果系数是-1的话就直接输出-x号*/else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);one_time=0;}else{if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/{if(p->xishu>0)printf("+%5.2f",p->xishu); /*如果系数是正的话前面就要加+号*/}else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/printf("+X^%d",p->zhishu);else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/printf("X^%d",p->zhishu);else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf("+%5.2fX^%d",p->xishu,p->zhishu);else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf("%5.2fX^%d",p->xishu,p->zhishu);}p=p->next; /*指向下一个指针*/}printf("\n");/*两个多项式的加法运算*/pnode * add(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/float x; /*x为系数的求和*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu+q->xishu; /*系数就应该相加*/if(x!=0) /*相加的和不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next; /*q向右移动*/}else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL){s=(pnode *)malloc(sizeof(pnode));s->xishu=q->xishu;s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}/*两个多项式的减法运算*/pnode * sub(pnode *heada,pnode *headb){pnode *headc,*p,*q,*s,*r;float x; /*x为系数相减*/p=heada; /*指向第一个多项式的头*/q=headb; /*指向第二个多项式的头*/headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/r=headc;while(p!=NULL&&q!=NULL) /*两个多项式的某一项都不为空时*/{if(p->zhishu==q->zhishu) /*指数相等的话*/{x=p->xishu-q->xishu; /*系数相减*/if(x!=0) /*相减的差不为0的话*/{s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/s->xishu=x;s->zhishu=p->zhishu;r->next=s;r=s;}q=q->next;p=p->next; /*2个多项式都向右移*/}else if(p->zhishu<q->zhishu) /*p的系数小于q的系数的话*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}else{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next; /*p向右移动*/}}while(p!=NULL) /*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=p->xishu;s->zhishu=p->zhishu;r->next=s;r=s;p=p->next;}while(q!=NULL) /*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/{s=(pnode *)malloc(sizeof(pnode));s->xishu=-q->xishu; /*建立的节点的系数为原来的相反数*/ s->zhishu=q->zhishu;r->next=s;r=s;q=q->next;}r->next=NULL; /*最后指向空*/headc=headc->next; /*第一个头没有用到*/return headc; /*返回头接点*/}void add_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=add(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相加如下:");shuchu(c);}void sub_main(){pnode * a,*b,*c;printf("\n输入第一个一元多项式:\n系数指数\n");a=creat();tiaozhen(a);printf("\n输入第二个一元多项式:\n系数指数\n");b=creat();tiaozhen(b);c=sub(a,b);printf("第一个一元多项式如下:");shuchu(a);printf("第二个一元多项式如下:");shuchu(b);printf("两式相减如下:");shuchu(c);}void open(){printf("\n****************************************************\n");printf(" 功能项: * 1 两个一元多项式相加;2 两个一元多项式相减;0 退出*\n");printf("****************************************************\n\n请选择操作: ");}void main(){int choose;open();while(choose!=0){scanf("%d",&choose);getchar();switch(choose){case 0:return;case 1:printf("\n 两个一元多项式相加\n");add_main();choose=-1;open();break;case 2:printf("\n 两个一元多项式相减\n");sub_main();choose=-1;open();break;default:printf("没有该选项!请重新选择操作!\n\n");open();}}}三、测试方案及结果1、测试方案在Visual C++ 6.0环境中调试运行。
两个一元多项式相加
两个一元多项式相加
《两个一元多项式相加》
哎呀!今天老师在数学课上讲了两个一元多项式相加,这可把我难住啦!
啥是一元多项式呀?一开始我是一头雾水。
老师在黑板上写了一堆式子,比如说:3x + 5 和2x - 1 。
老师说要把它们相加,这可咋办?
我瞅瞅同桌,他也皱着眉头,一脸迷茫。
我小声问他:“你懂了没?”他摇摇头说:“这也太难了,谁能搞明白呀?”
老师开始讲解啦,她就像一个神奇的魔法师,一边写一边说:“同学们,咱们先看这两个多项式的同类项,啥是同类项呢?就像一群小伙伴,x 就是它们的标志,系数不一样没关系,但字母和指数得一样。
” 我心里想:这咋跟找朋友似的?
老师接着说:“那3x 和2x 就是同类项,5 和-1 也是同类项。
把同类项的系数相加,3x + 2x 不就等于5x 嘛,5 + (-1)不就是4 嘛。
” 我恍然大悟,这不就像把相同颜色的糖果放到一起嘛!
我赶紧拿起笔自己算,可算着算着又迷糊了。
我拍拍前桌的肩膀问:“你能再给我讲讲不?”前桌回过头来,耐心地说:“你看啊,就像搭积木,相同的积木块堆在一起,数字和字母都不能乱。
”
经过一番努力,我终于算出了几道题。
这感觉太棒啦,就像解开了一个超级大谜题!
等到下课铃响,我还有点意犹未尽呢。
我跟小伙伴们说:“这两个一元多项式相加,一开始觉得像个大怪兽,现在发现也没那么可怕嘛!”
我觉得呀,数学虽然有时候很难,但是只要我们认真听老师讲,多和同学们讨论,就一定能战胜这些难题!就像爬山一样,虽然过程中会累会遇到困难,但是当我们爬到山顶,看到美丽的风景,就会觉得一切都值得!。
两个一元多项式相加-c++版
《数据结构》实验报告——两个一元多项式相加一、实验题目:两个一元多项式相加二、实验内容:根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加三、设计思想:(1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。
(2)用成员函数merg(qList<Telem>&l2)实现两多项式的相加。
实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系数)及它自己(指数)插入第一个多项式列表的后面。
(3)建立函数shu(double a[],int j)实现多项式的输入。
四、源程序代码#include "stdafx.h"#include<iostream>using namespace std;template<class Telem>class List{private:Telem * elem;int curlen;int maxlen;public:List(int maxsz=100):maxlen(maxsz){curlen=0;elem=new Telem{maxlen};};List(Telem a[],int n,int maxsz=100):maxlen(maxsz){curlen=n;elem=new Telem[maxlen];for(int i=0;i<n;i++)elem[i]=a[i];};~List(){delete[] elem;};Telem gete(int i){if(i>=1&&i<=curlen)return elem[i-1];else return NULL;};int leng(){return curlen;};List<Telem>&merg(List<Telem>&l2);//声明两多项式相加的成员函数};template<class Telem>List<Telem>&List<Telem>::merg(List<Telem>&l2)//两多项式相加的成员函数的实现{int i,j,m,n,k(0);m=curlen;n=l2.curlen;if(m+n<=maxlen){for(i=0;i<n/2;i++){for(j=0;j<m/2;j++)if(elem[2*j+1]==l2.elem[2*i+1]){k++;elem[2*j]+=l2.elem[2*i];break;}if(j==m/2){elem[m+2*(i-k)]=l2.elem[2*i];elem[m+2*(i-k)+1]=l2.elem[2*i+1];}}}curlen=m+n-2*k;return *this;}void fun(double a[],int j)//该函数实现:输入2j个double型的数,并将其存储到数组中{int i;for(i=0;i<j;i++){double m,n;cout<<"请输入第"<<i+1<<"项的系数和指数:";cin>>m>>n;a[2*i]=m;a[2*i+1]=n;}}void main(){int i,j,k;cout<<"第一个多项式的个数:";cin>>j;double *a=new double[2*j];fun(a,j);cout<<"第二个多项式的个数为:";cin>>k;double *b=new double[2*k];shu(b,k);List<double>s1(a,2*j);List<double>s2(b,2*k);s1.merg(s2);cout<<"二个多项式相加结果为:";for(i=1;i<=s1.leng()/2;i++)//用for循环将这二个多项式结果输出{cout<<s1.gete(2*i-1)<<"X^"<<s1.gete(2*i);if(i!=s1.leng()/2)cout<<"+";}cout<<endl;}五、程序运行结果截图。
一元多项式问题
一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述:一元多项式相加是通过键盘输入两个形如p0+p1*x^1+p2*x^2+pn*x^n的多项式,经过程序运算后在屏幕上输出它们的相加和。
二、数据结构设计:分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都有“系数—指数”两部分组成,所以可以将它抽象成一个有“系数—指数对”构成的线性表,由于对多项式中系数为0的子项可以不记录它的指数值,对于这样的情况就不再付出存储空间来存放它了。
基于这样的分析,可以采用一个带有头结点的单链表来表示一个一元多项式。
具体数据类型定义为:typedef struct node{float coef;int exp;int flag;struct node *next;}PolyNode;三、功能(函数)设计:1、输入并建立多项式的功能模块PolyNode * create(){float A;int B;PolyNode *a=NULL;PolyNode *b=NULL;PolyNode *c=NULL;scanf("%f,%d",&A,&B);while(A!=0||B!=0){if(A!=0){c=new PolyNode;c->coef=A;c->exp=B;c->flag=0;c->next=NULL;if(a==NULL){a=c;b=a;}else{b->next=c;b=c;}}scanf("%f,%d",&A,&B);}return a;}2、多项式相加的功能模块PolyNode *add(PolyNode *p,PolyNode *q){PolyNode *x,*y;PolyNode *r=NULL;PolyNode *c=NULL;PolyNode *l=NULL;x=p;y=q;while(x&&y){r=new PolyNode;if(x->exp==y->exp){r->coef=x->coef+y->coef;r->exp=x->exp;r->flag=0;r->next=NULL;x->flag=1;y->flag=1;x=x->next;y=y->next;}else if(x->exp>y->exp){r->coef=y->coef;r->exp=y->exp;r->flag=0;r->next=NULL;y->flag=1;y=y->next;}else{r->coef=x->coef;r->exp=x->exp;r->flag=0;r->next=NULL;x->flag=1;x=x->next;}if(c==NULL){c=r;l=c;}else{l->next=r;l=r;}}if(x==NULL)x=y;while(x){r=new PolyNode;r->coef=x->coef;r->exp=x->exp;r->flag=0;r->next=NULL;if(c==NULL){c=r;l=c;}else{l->next=r;l=r;}x->flag=1;x=x->next;}return c;}3、多项式显示的功能模块int print(PolyNode *w){if(w==NULL){cout<<'0';return 0;}PolyNode *v;v=w;cout<<'(';if(v->coef<0)cout<<'-';cout<<v->coef<<'x'<<v->exp;v=v->next;while(v){if(v->coef>=0)cout<<'+';cout<<v->coef<<'x'<<v->exp;v=v->next;}cout<<')';}四、界面设计:注意提示用户每一步操作输入的格式和限制,指导用户按照正确的格式输入数据。
(C语言)加法运算实验报告
cout<<"两个多项式之和为:"<<endl;
cout<<"A+B=";
result(add(A,B));
cout<<endl;
return 0;
}
//当 p 不为空时进行循环;
{
PolyLink A,B;
A=Ini_polynode();
B=Ini_polynode();
cout<<"输入第一个多项式:"<<endl;
input(A);
cout<<"A=";
result(A);
cout<<"输入第二个多项式:"<<endl;
input(B);
cout<<"B=";
result(B);
2、 测试结果:
①输入 A=x+3x^6-8x^11
输入 B=6-3x^6+21x^9
输出 A+B=6+x+21x^9-8x^11
②输入 A=x+x^3
输入 B=-x-x^3
输出 A+B=0
③输入 A=x+x^100
输入 B=x^100+x^200
输出 A+B=x+2x^100+x^200
④输入 A=x+x^2+x^3
一元多项式的加法运算
一、 需求分析
1、 程序的基本功能 1 按照指数升序次序,输入并建立多项式 A 与 B。 2 计算多项式 A 与 B 的和,即建立多项式 A+B。 3 按照指数升序次序,输出多项式 A、B、A+B。 2、 输入输出要求: 1 输入多项式;
数据结构C语言版部分习题及答案[2]
第二章习题与解答一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。
(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的()个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。
(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取(B)花费的存储空间较顺序存储少(C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表(B)双链表(C)单循环链表(D)带头结点的双循环链表6.循环链表的主要优点是( )。
(A)不在需要头指针了(B)已知某个结点的位置后,能够容易找到他的直接前趋(C)在进行插入、删除运算时,能更好的保证链表不断开(D)从表中的任意结点出发都能扫描到整个链表7.下面关于线性表的叙述错误的是( )。
数据结构_一元多项式的表示与相加
实验一一元多项式的表示与相加实验目的:1.复习并熟练掌握数据结构所使用的程序设计语言——C语言;2.学会单步跟踪、调试自己的程序;3.加深对线性表特别是链表知识的理解和掌握,并能够运用相关知识来解决相关的具体问题,如一元多项式相加等;程序流程:1.定义一元多项式链表结构体类型;2.输入多项式项数以分配存储空间;3.输入多项式每项的系数和指数,将其插入当前多项式链表。
同时判断是否有与当前节点指数相同的项,若存在,则将两项系数相加合并。
此外,若存在系数为0的项,将其存储空间释放;4.进行多项数加法时,新建一个存储结果的链表,分别将两多项式各项依次插入结果多项式即完成多项式相加运算;5.进行多项数加法时,将减项多项式各项系数化为相反数后进行加法操作,即完成多项式相减运算;6.对x赋值后,将x值代入多项式进行运算得到多项式的值;7.输出多项式。
注意:进行完一次运算以后,应该及时销毁无用多项式以释放空间以便再次应用。
算法及注释:1)定义一元多项式链表结构体类型typedef struct Lnode{float cof; //定义系数int exp; //定义指数struct Lnode *next; //定义指针变量指向下一个节点}Lnode ,*Linklist; //定义新的变量类型2)建立多项式存储线性链表头结点void makehead(Linklist &head){head=(Linklist)malloc(sizeof(Lnode)); //建立新的节点head->exp=-1;head->next=NULL; //指针赋空head->cof=1;}3)将输入的多项式信息存储于节点中void makelnode(Lnode *&p){p=(Lnode*)malloc(sizeof(Lnode)); //建立新的节点printf("Input the cof and exp\n");scanf("%fx%d",&p->cof,&p->exp); //输入多项式底数指数信息p->next=NULL; //指针赋空}4)清除系数为零的多项式节点void clear(Linklist la){Lnode *p,*q; //定义两个指向结构体的指针p=la;q=p->next;while (q){if (fabs(q->cof)<=0.000001) { //判断系数为零p->next=q->next; //指针指向相隔的下一个节点free(q); //销毁系数为零的节点q=p->next; //指针后移一位}else {p=p->next; //p q分别后移一位q=q->next;}}}5)找到多项式中与当前节点同指数项位置int locate(Linklist l,Lnode *&p,Lnode*e){p=l;//标记表头if (!l->next)return(0);while(p&&e->exp!=p->exp){//当p存在且指数不相等时指针后移p=p->next;}if(p)return(p);//当p存在时,返回p地址else {//没找到时寻找出插入位置p=l;while (p->next&&e->exp<=p->next->exp)p=p->next;if (!p->next){p=p;return(0);}return(0);}}6)将多项式节点插入已有多项式链表中,同时完成系数运算void caseinsert(Linklist &l,Lnode *e){Lnode *p;if (locate(l,p,e)){//指数相同项系数相加p->cof += e->cof;free(e);}else{//插入新的项e->next=p->next;p->next=e;}}7)创建新的多项式链表void creat(Linklist &head,int m){Lnode *p;int i;makehead(head);//建立头结点for (i=1;i<=m;i++){p=(Linklist)malloc(sizeof(Linklist));//建立新的多项式单个节点空间makelnode(p);//建立赋值caseinsert(head,p);//将多项式节点插入已有多项式链表中,同时完成系数运算}clear(head);}8)输入多项式项数并创建节点进行存储void input(Linklist &l){int m;printf("Input the Poly numbers\n");scanf("%d",&m);creat(l,m);//建立一个l指向的头指针有m项的多项式链表}9)输出多项式void print(Linklist l){Lnode *p;p=l->next;printf("Poly:%6fx^%d",p->cof,p->exp);p=p->next;while (p){if(p->cof>0) printf("+");//系数正负号if (fabs(p->cof)<=0.000001); break;//不输出系数为零的项printf("%6fx^%d",p->cof,p->exp);p=p->next;//指针后移}printf("\n");}10)进行多项式加法运算void add(Linklist la,Linklist lb,Linklist &lc){ Lnode *p,*q,*q1,*p1;p=la->next;q=lb->next;makehead(lc);//建立一个新的表头while(p){p1=p->next;caseinsert(lc,p);//将多项式节点p插入已有多项式链表lc中,同时完成系数运算p=p1;//指针后移}while(q){q1=q->next;caseinsert(lc,q);//将多项式节点q插入已有多项式链表lc中,同时完成系数运算q=q1;}}11)将减项多项式转化为系数为相反数的多项式便于转化为加法运算void reverse(Linklist &l){Linklist p;p=l->next;while(p){p->cof*=-1;//系数自乘-1p=p->next;}}12)进行多项式减法运算void sub(Linklist la,Linklist lb,Linklist &lc){reverse(lb);add(la,lb,lc);clear(lc);//清除头结点}13)对x赋值进行多项式赋值运算float value(Linklist l,float x){float sum=0,t;int i;Linklist p=l->next;while(p){t=1;for (i=p->exp;i>0;i--)t*=x;sum=sum+t*p->cof;p=p->next;}return(sum);}14)销毁已有多项式,清除已有多项式占用的存储空间void destroy(Linklist la){Lnode *p,*q;p=la;while(p){q=p;p=p->next;free(q);}}15)创建主程序即菜单界面void main(){Linklist l[10];int c,n,m,i;float a;printf("Choose the number to operate:\n");printf(" 1:Creat a Poly\n");printf(" 2:Poly Addition\n");printf(" 3:Poly Substraction\n");printf(" 4:Evaluation\n");printf(" 5:Destroy a Poly\n");printf(" 6:Print a Poly\n");printf(" 0:Exit\n");printf("\nDestroy the Polys after used.\n");printf("\n*use ',' to separate\n");scanf("%d",&c);while (c){switch (c){case 1: printf("Input the Poly number 1~9\n");scanf("%d",&n);input(l[n]);break;case 2: printf(" Input the Poly number to add,and the Poly number stored in\n");scanf("%d,%d,%d",&n,&m,&i);add(l[n],l[m],l[i]);break;case 3: printf(" Input the Poly number to subtract,and the Poly number stored in\n");scanf("%d,%d,%d",&n,&m,&i);sub(l[n],l[m],l[i]);break;case 4: printf("Input the number to operate and the value of x:\n");scanf("%d,%f",&n,&a);printf("%f\n",value(l[n],a));break;case 5: printf("Input the Poly number:\n");scanf("%d",&n);destroy(l[n]);break;case 6: printf(" Input the Poly number:\n");scanf("%d",&n);print(l[n]);case 0: n=0;break;default:printf("ERROR!");}printf("Choose the number to operate:\n");scanf("%d",&c);}printf("OK!\n");程序运行截图:实验总结:这次实验室数据结构第一次上机实验,由于与C语言课程的学习相隔已经一个学期,对C语言有些生疏和遗忘,在编程过程中出现很多错误。
第2章 线性表习题及参考答案
第二章线性表习题一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。
(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的()个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。
(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取 (B)花费的存储空间较顺序存储少(C)便于插入和删除 (D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表 (B)双链表 (C)单循环链表 (D)带头结点的双循环链表6.循环链表的主要优点是( )。
一元多项式表示与相加
系数 coef 指数 exp 指针 next
结点结构体定义如下: struct Polynode { int coef; int exp; Polynode *next; } Polynode , * Polylist;
例:建立一元多项式链式存储算法 【算法思想】通过键盘输入一组多项式的系数和指数,用尾插法建立一元 多项式的链表。以输入系数 0 为结束标志,并约定建立多项式链表时,总 是按指数从小到大的顺序排列。 【算法描述】
scanf(“%d,%d”,&c,&e);/*键入多项式的系数和指数项*/
while(c!=0)
/*若 c=0,则代表多项式的输入结束*/
{
s=(Polynode*)malloc(sizeof(Polynode)); /* 申 请 新
的结点*/
s->coef=c ;
s->exp=e ;
rear->next=s ;
① 若 p->exp< q->exp,则结点 p 所指的结点应是“和多项式”中的 一项,令指针 p 后移;
② 若 p->exp=q->exp,则将两个结点中的系数相加,当和不为零时 修改结点 p 的系数域,释放 q 结点;若和为零,则和多项式中无此项,从 A 中 删去 p 结点,同时释放 p 和 q 结点。
B(x)=8x+22x7-9x8
polya
-1
polyb
-1
70 81
31
98
5 17 ∧
22 7
-9 8 ∧
(2)多项式相加的运算规则 为了保证“和多项式”中各项仍按升幂排列,在两个多项式中: ①指数相同项的对应系数相加,若和不为零,则构成“和多项式”中的一 项; ②指数不相同的项仍按升幂顺序复抄到“和多项式”中。 【算法思想】以单链表 polya 和 polyb 分别表示两个一元多项式 A 和 B, A+B 的求和运算,就等同于单链表的插入问题(将单链表 polyb 中的结点插入 到单链表 polya 中),因此 “和多项式“中的结点无需另生成。 为实现处理,设 p、q 分别指向单链表 polya 和 polyb 的当前项,比较 p、q 结点的指数项,由此得到下列运算规则:
一元多项式相加
⼀元多项式相加描述:对于两个⼀元多项式,如果需要对他们进⾏多项式相加操作,常见的两种思路如下:(1)对于⼀个多项式,保存其最⾼项次数HighPowder,以及⼀个该多项式对应次数分别为0-HighPowder的各项的系数的数组()。
(2)多项式中系数不为零的每⼀项,保存其系数与该项的次数。
下⾯分别⽤这两种思路实现⼀元多项式加法操作。
思路⼀(数组实现):数据结构定义:1 typedef struct Poly2 {3int CoeffArray[11];4int HighPower;5 } *Polynomial;实现:1 #include <stdio.h>2 #include <stdlib.h>34 typedef struct Poly5 {6int CoeffArray[11];7int HighPower;8 } *Polynomial;910void ZeroPolynomial(Polynomial Poly)11 {12int i;13for(i = 0; i < 11; i++)14 {15 Poly->CoeffArray[i] = 0;16 }17 Poly->HighPower = 0;18 }1920void AddPolynomial(Polynomial Poly1,Polynomial Poly2, Polynomial PolySum)21 {22int i;23 ZeroPolynomial(PolySum);24 PolySum->HighPower = Poly1->HighPower > Poly2->HighPower?25 Poly1->HighPower:Poly2->HighPower;26for(i = PolySum->HighPower; i >= 0 ; i--)27 {28 PolySum->CoeffArray[i] = Poly1->CoeffArray[i] + Poly2->CoeffArray[i];29 }30 }3132int main(void)33 {34int i,j,k;35 Polynomial P1,P2,Sum;36 P1 = malloc(sizeof(struct Poly));37 P2 = malloc(sizeof(struct Poly));38 Sum = malloc(sizeof(struct Poly));39//初始化40 ZeroPolynomial(P1);41 ZeroPolynomial(P2);42 P1->HighPower = 10;43for(i = 10; i >= 0; i--)44 {45 P1->CoeffArray[i] = i;46 }4748 P2->HighPower = 8;49for(j = 8; j >=0; j--)50 {51 P2->CoeffArray[j] = j;52 }53 P2->CoeffArray[8] = 8;54 AddPolynomial(P1,P2,Sum);5556 printf("The high power of the Polynomial is %d\n",Sum->HighPower); 57for(k = 0; k <= 10; k++)58 {59 printf("The Coeff of power %d is %d\n",k,Sum->CoeffArray[k]);60 }6162return0;63 }它适合⼤部分项都有的稠密多项式。
一元多项式的相加(数据结构)
实验报告课程名称:数据结构实验名称:一元多项式的相加班级: 1333 学生姓名:蔡景旺学号: 37一、需求分析1.用户可以根据自己的需求分别输入两个一元多项式(输入必须按指数递增顺序),并且能够实现输入的一元多项式的显示。
2.能够完成两个一元多项式的相加功能并显示结果。
3.程序执行的命令包括:(1)构造链表A (2)构造链表B (3)两个链表的相加(4)求链表的长度(5)打印(显示)已有的链表二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT Polynomial {数据对象:D={a i:|a i∈TermSet,i=1…n,n≥0TermSet 中的每个元素包含一个表示系数的实数和表示指数的整数} 数据关系:R1={<a i-1,a i>|a i-1,a i∈D,且a i-1中的指数值< a i中的指数值i=2,…n≥0}基本操作:CreatPolyn(&p,m)操作结果:输入m项的系数和指数,建立一个一元多项式P。
DestroyPolyn(&p)初始条件:一元多项式P已存在。
操作结果:销毁一元多项式P。
PrintPolyn(P)初始条件:一元多项式P已存在。
操作结果:打印输出一元多项式P。
PolynLength(P)初始条件:一元多项式P已存在。
操作结果:返回一元多项式中P的项数。
AddPolyn(&Pa,&Pb)初始条件:一元多项式Pa和Pb已存在。
操作结果:完成一元多项式相加运算,即:Pa=Pa+Pb,销毁一元多项式Pb.}ADT Polynomailtypedef struct{ // 项的表示,多项式为linklist的数据元素float coef; //系数int evpn; //指数}term,ElemType; //两个类型名:term用于本ADT,ElemType为Linklist的数据对象名Typedef Linklist polynomial; //用带表头结点的有序链表表示多项式;Int cmp(term a,term b);void CreatPolyn (polynomial &P,int m){//输入m项的系数和指数,建立表示一元多项式的有序链表PInitList (P); h = GetHead (P);e.coef = 0.0;e.expn = -1;SetCurElem (h,e); //设置头结点的数据元素for (i = 1;i<=m;++i){//依次输入m项非零项scanf(e.coef,e.expn);if (! LocateElem(P,e,q,(*cmp)){ //当链表不存在指数项if(MakeNode (s,e)) InsFirst(q,s);//生成结点并插入链表}}}//CreatPolynvoid AddPolyn(polynomial &Pa, polynomial &Pb){//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”ha=Gethead(Pa); hb=Gethead(Pb);//ha和hb分别指向Pa和Pb的头结点qa=NextPos(Pa,ha); qb=NextPos(Pb,hb);// /ha和hb分别指向Pa和Pb的当前结点while(qa&&qb){//qa和qb均非空a=GetCurElem(qa); b=GetCurElem(qb);switch(*cmp(a,b)){case -1: //多项式PA中当前结点的指数值小ha=qa;qa= NextPos(Pa,ha);break;case 0://l两者的指数相等sum=a.cofe+b.cofe;if(sum!=0.0){//修改多项式PA中当前结点的系数值SetCurELem(qa,sum);ha=qa;}else {//删除当前结点Delfirst(ha,qa);FreeNode(qa);}Delfirst(ha,qa);FreeNode(qa); qb=NextPos(Pb,hb); qa=NextPos(Pa,ha);break;Case1://多项式PB中当前结点的指数值小DelFirst(hb,qb); InsFirst(ha,qb);qb=NextPos(Pb,hb); qa=NextPos(Pa,ha);break;}//swtich}//whileIf(!ListEmpty(Pb)) Append(Pa,qb);FreeNode(hb)://释放Pb头结点}//AddPolyn2. 数据结构分析:逻辑结构为线性表,采用链式存储结构。
C++一元多项式计算问题-课程设计说明书2
学院课程设计说明书题目一元多项式计算问题系(部) 计算机科学与技术系专业(班级) 计算机科学与技术专业姓名学号指导教师起止日期第十三、十四周课程设计任务书课程名称:数据结构与算法设计题目:一元多项式计算问题已知技术参数和设计要求:问题描述:设计一个稀疏多项式简单计算器基本要求:(1)输入并分别建立多项式A和B(2)输入输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数降序排列(3)完成两个多项式的相加、相减,并将结果输出;测试数据:(1) A+B A= 3x14-8x8+6x2+2 B=2x10+4x8+-6x2(2) A-B A=11x14+3x10+2x8+10x6+5 B=2x14+3x8+5x6+7(3) A+B A=x3+x1 B=-x3-x1(4) A+B A=0 B=x7+x5+x3+x1(5) A-B A=100x100+50x50+20x20+x B=10x100+10x50+10x20+x选作内容:(1).多项式在x=1时的运算结果(2)求多项式A和B的乘积设计工作量:40课时工作计划:指导教师签名:日期:教研室主任签名:日期:系主任签名:日期:长沙学院课程设计鉴定表摘要本文是关于一个一元稀疏多项式计算器的问题。
一元稀疏多项式计算内容包括输入并建立多项式,多项式相加,多项式求值,多项式求乘积以及输出多项式。
本程序运用面向对象程序设计方法,使用C++语言,利用Microsoft Visual C++ 6.0开发工具,还有数据结构课中学到的链式存储结构,存储一元稀疏多项式,从而实现程序的基本功能。
在程序中定义了各种类型的运算的模块,通过主程序的调用来完成它们之间的配合,进而使得一元稀疏多项式计算器的顺利运行。
关键词:数据结构;一元稀疏多项式;链表; C++语言目录1 设计内容与要求 (1)2.设计说明 (1)2.1 问题描述与功能设计 (1)2.2 数据结构与算法 (1)2.3 函数定义 (3)2.4 界面设计 (4)2.5 编码 (5)2.6 测试 (10)3 总结 (14)参考文献 (15)附录A 源代码 (16)⒈设计内容与要求设计内容:设计一个稀疏多项式简单计算器,能够进行简单的基本运算。
用C语言解决一元多项式运算问题
用C语言解决一元多项式运算问题摘要本数据结构课程设计运用一元多项式运算的基本法则,对一元多项式的加法、减法运算进行设计,并有人机交换界面。
本课程设计中,系统开发平台为Windows XP;程序设计语言主要采用C语言,其中也掺入了C++部分语句,兼而两者的优势并存;开发环境为Microsoft Visual C++ 6.0,友好的界面、功能更加强大,相比较于C语言的专用开发环境Turbo C,其操作简单却已能完全在其环境中借用C语言开发设计出源程序;程序运行平台为Windows 98/2000/XP,程序兼容特性比较强,具有很好的移植特性。
在程序设计中,整个程序层次结构突出,直观性与易理解性优势明显。
程序通过调试运行后,完成了一元多项式运算的各种操作的设想,符合题目要求,初步实现了设计目标,达到了预期的效果。
关键词:数据结构课程设计; C程序语言;多项式1 引言计算机的快速发展,特别是计算机网络的发展,越来越深刻地改变了人们生活的方方面面。
但同时,也要求人们能高效、有效地完成某些运算任务。
而“数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。
本课程设计主要是对所学的数据结构知识进行整合和运用,解决在一元多项式的运算,包括加法、减法及乘法运算,通过该程序,将大大减少运算时间,提高工作效率。
2 课程设计目的在我们对一个具体的问题进行分析时,往往要抽象出一个模型,设计一个算法来实现所需要达到的功能。
在此程序中,我们主要是综合运用所学过的知识,回顾VC++编程的同时,熟悉并掌握数据结构中的算法分析与设计。
同时,要掌握类C语言的算法转换成C程序并上机调试的基础;这次课程设计,要求设计一个C语言程序,该程序能够按照指数的降幂排列,并完成多个一元多项式的相加、相减、相乘,并将结果输出。
通过这次课程设计,进一步巩固《数据结构》等课程所学的知识,特别加强指针、结构体、文件数据类型的应用,熟悉面向过程的结构化、了解面向对象设计方法,通过本次课程设计的实践,加强动手能力的操作,掌握程序设计的流程,以及用C程序语言编写程序,从而解决实际问题的能力,了解掌握Visual C++开发环境,在老师的指导下,独立完成课程设计的全部内容,培养严谨的科学态度和认真学习的工作作风,培养创造性思维方式。
数据结构:链表的应用-求两个一元多项式之和
!= NULL && p2 == NULL) || (p1 == NULL && p2 != NULL)) || p1 != NULL || p2 != NULL) { if(p1 == NULL && p2 != NULL) {
Pnode pnew = (Pnode)malloc(sizeof(Pnode)); if(NULL == pnew) { exit(-1); }
printf("\n"); }
int main(void) {
Pnode p1,p2; int a,b; char x;
printf("输入未知字母(如 x,y,z 等):"); scanf("%c",&x);
精美文档
5
printf("输入第一个多项式的项数:"); scanf("%d",&a); p1 = init(a);
printf("输入幂数:"); scanf("%d",&b); pnew->mi = b;
精美文档
2
ptail->next = pnew; pnew->next = NULL;
ptail = pnew; }
return phead; }
Pnode jia(Pnode p1,Pnode p2) {
构建中止 未命名 2: 15 个错误, 1 个警告
2.最后一次调试
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
多项式的运算
多项式的运算多项式是数学中常见的代数表达式,由一系列的变量和常数相加减组成。
在代数中,多项式的运算包括加法、减法、乘法以及除法等操作。
本文将介绍多项式的基本概念和常见的运算方法。
一、多项式的定义多项式是由单项式相加减而成的代数表达式。
单项式是只由一个变量项相乘而得的代数表达式,如2x、3xy²等。
而多项式则由多个单项式相加减组成。
一个一元多项式的一般形式可以表示为:P(x) = aₙxⁿ + aₙ₋₁xⁿ⁻¹ + ... + a₁x + a₀其中,P(x) 表示多项式函数,aₙ是系数,x是变量,n是整数且大于等于零的次数。
aₙxⁿ 称为多项式的首项,a₀称为常数项。
二、多项式的加法与减法多项式加法和减法的运算规则相同。
对于两个多项式P(x) 和Q(x),其相加减的过程是将对应的单项式进行相加减,并合并同类项。
例如,对于多项式 P(x) = 3x² + 2x + 1 和 Q(x) = 2x² + x - 3,它们的相加结果为:P(x) + Q(x) = (3x² + 2x + 1) + (2x² + x - 3)= 5x² + 3x - 2同样地,对于多项式的减法 P(x) - Q(x) 的操作也是类似的。
三、多项式的乘法多项式的乘法是将每个项与另一个多项式的每个项相乘,然后合并同类项的结果。
考虑两个多项式 P(x) = 2x³ - x² + 3x + 1 和 Q(x) = x² - 2x + 2:P(x) × Q(x) = (2x³ - x² + 3x + 1) × (x² - 2x + 2)= 2x⁵ - 5x⁴ + 6x³ + 2x² - 4x + 2四、多项式的除法多项式的除法是通过除以另一个多项式,得到商式和余式。
对于两个多项式 P(x) 和 D(x),P(x) ÷ D(x) 的结果可以表示为:P(x) = Q(x) × D(x) + R(x)其中,Q(x) 为商式,R(x) 为余式,且 R(x) 的次数小于 D(x)。
一元多项式习题及解答
习 题 一A 组1. 判别{},a a b =+∈QQ 是否为数域? 解 是.2. 设32()1f x x x x =+++,2()32g x x x =++,求()()f x g x +,()()f x g x -,()()f x g x . 解 32()()243f x g x x x x +=+++,3()()21f x g x x x -=--,5432()()46652f x g x x x x x x =+++++.3.设19932199431995()(54)(421)(8112)f x x x x x x =----+,求()f x 的展开式中各项系数的和. 解 由于()f x 的各项系数的和等于(1)f ,所以199319941995(1)(54)(421)(8112)1f =----+=-.4. 求()g x 除以()f x 的商()q x 与余式()r x .(1) 322()31,()321f x x x x g x x x =---=-+; (2) 42()25,()2f x x x g x x x =-+=-+.解 (1) 用多项式除法得到 所以,17262(),()3999q x x r x x =-=--. (2) 用多项式除法得到 所以,2()1,()57q x x x r x x =+-=-+.5.设,a b 是两个不相等的常数,证明多项式()f x 除以()()x a x b --所得余式为()()()()f a f b af b bf a x a b a b--+--. 证明 依题意可设()()()()f x x a x b q x cx d =--++,则解得故所得余式为()()()()f a f b af b bf a x a b a b--+--.6. 问,,m p q 适合什么条件时,()f x 能被()g x 整除?(1) 3()f x x px q =++,2()1g x x mx =+-;(2) 42()f x x px q =++,2()1g x x mx =++.解 (1) 由整除的定义知,要求余式()0r x =.所以先做多项式除法,要求2()(1)()0r x p m x q m =+++-=, 所以2(1)0,0p m q m ++=-=.即21,p m q m =--=时,可以整除.(2) 方法同上.先做多项式除法,所得余式为22()(2)(1)r x m p m x q p m =--++--,所以22(2)0,10m p m q p m --=+--=,即01m p q ==+,或22,1p m q -==时,可以整除.7. 求()f x 与()g x 的最大公因式:(1) 43232()341,()1f x x x x x g x x x x =+---=+--;(2) 4332()41,()31f x x x g x x x =-+=-+;(3) 42432()101,()61f x x x g x x x =-+=-+++.解 (1) 用辗转相除法得到用等式写出来,就是2()()(231)f x xg x x x =+---,21133()(231)2444g x x x x x ⎛⎫⎛⎫=-+----+ ⎪ ⎪⎝⎭⎝⎭,284332313344x x x x ⎛⎫⎛⎫---=+-- ⎪⎪⎝⎭⎝⎭,所以()(),()1f x g x x =+.(2) 同样地,所以()(),()1f x g x =.(3) 同样用辗转相除法,可得 ()2(),()1f x g x x =--.8. 求(),()u x v x 使()()()()()(),()u x f x v x g x f x g x +=:(1) 432432()242,()22f x x x x x g x x x x x =+---=+---:(2) 43232()421659,()254f x x x x x g x x x x =--++=--+:(3) 4322()441,()1f x x x x x g x x x =--++=--.解 (1) 利用辗转相除法,可以得到3()()(2)f x g x x x =+-,32()(1)(2)(2)g x x x x x =+-+-,322(2)x x x x -=-.因而,()2(),()2f x g x x =-,并且所以()1,()2u x x v x x =--=+(2) 利用辗转相除法,可以得到2()2()(639)f x xg x x x =-+-,211()(639)(1)33g x x x x x ⎛⎫=-+--+-- ⎪⎝⎭, 2(639)(1)(69)x x x x -+-=--+.因而,()(),()1f x g x x =-,并且 所以21122(),()13333u x x v x x x =-+=--. (3) 利用辗转相除法,可以得到2()(3)()(2)f x x g x x =-+-, ()(1)(2)1g x x x =+-+.因而()(),()1f x g x =,并且所以32()1,()32u x x v x x x x =--=+--. 9. 设323()(1)22,()f x x t x x u g x x tx u =++++=++的最大公因式是一个二次多项式,求,t u 的值.解 利用辗转相除法,可以得到 2()()(1)(2)f x g x t x t x u =+++-+,222222212()(1)(2)[(1)(2)]()(1)(2)1(1)(1)(1)t t t u t t u t t g x x t x t x u x t t t t ⎡⎤⎛⎫-+-++-+--⎡⎤=+++-+++ ⎪⎢⎥⎣⎦++++⎝⎭⎣⎦由题意,()f x 与()g x 的最大公因式是一个二次多项式,所以解得0,4u t ==-.10. 设()242(1)1x Ax Bx -++,求A 和B .解 用2(1)x -去除()f x 421Ax Bx =++,得余式1()(42)13r x A B x A B =++--,由题意要求知1()0r x =,即解得1,2A B ==-.11. 证明:如果()(),()1f x g x =,()(),()1f x h x =,那么()(),()()1f x g x h x =.证明 由条件可知,存在1()u x 和1()v x 使得11()()()()1u x f x v x g x +=,存在2()u x 和2()v x 使得22()()()()1u x f x v x h x +=.用()h x 乘以第一式得11()()()()()()()u x f x h x v x g x h x h x +=,代入第二式得[]2211()()()()()()()()()1u x f x v x u x f x h x v x g x h x ++=,即[]21212()()()()()[()()]()()1u x u x v x h x f x v x v x g x h x ++=,所以()(),()()1f x g x h x =.12. 证明:如果()f x 与()g x 不全为零,且()()()()()(),()u x f x v x g x f x g x +=,那么()(),()1u x v x =.证明 由于()()()()()(),()u x f x v x g x f x g x +=,()f x 与()g x 不全为零,所以()(),()0f x g x ≠.两边同时除以()(),()0f x g x ≠,有()()()()()()1(),()(),()f x g x u x v x f x g x f x g x +=, 所以()(),()1u x v x =. 13. 证明:如果()(),()()d x f x d x g x ,且()d x 为()f x 与()g x 的一个组合,那么()d x 是()f x 与()g x 的一个最大公因式.证明 由题意知()d x 是()f x 与()g x 的公因式.再由条件设()()()()()d x u x f x v x g x =+. 又设()h x 为()f x 与()g x 的任一公因式,即()(),()()h x f x h x g x ,则由上式有 ()()h x d x .故而()d x 是()f x 与()g x 的一个最大公因式.14. 证明:()()()(),()()(),()()f x h x g x h x f x g x h x =,其中()h x 的首项系数为1.证明 显然()(),()()f x g x h x 是()()f x h x 与()()g x h x 的一个公因式.下面来证明它是最大公因式. 设(),()u x v x 满足()()()()()(),()u x f x v x g x f x g x +=,则()()()()()()((),())()u x f x h x v x g x h x f x g x h x +=.由上题结果知,()(),()()f x g x h x 是()()f x h x 与()()g x h x 的一个最大公因式,又首项系数为1,所以()()()(),()()(),()()f x h x g x h x f x g x h x =.15. 设多项式()f x 与()g x 不全为零,证明()()()(),1(),()(),()f x g x f x g x f x g x ⎛⎫= ⎪ ⎪⎝⎭.证明 设()()(),()d x f x g x =,则存在多项式(),()u x v x ,使()()()()()d x u x f x v x g x =+.因为()f x 与()g x 不全为零,所以()0d x ≠.上式两边同时除以()d x ,有()()()()1()()(),()(),()f x g x u x v x f x g x f x g x =+, 故()()()(),1(),()(),()f x g x f x g x f x g x ⎛⎫= ⎪ ⎪⎝⎭成立.16.分别在复数域、实数域和有理数域上分解41x +为不可约因式之积.解 在实数域上的分解式为 ()()4222221(1)211x x x x x +=+-=+++.在复数域上的分解式为4122222222x x x x x ⎛⎫⎛⎫⎛⎫⎛⎫+=+-++---+ ⎪⎪⎪⎪ ⎪⎪⎪⎪⎝⎭⎝⎭⎝⎭⎝⎭. 在有理数域上41x +是不可约多项式.否则,若41x +可约,有以下两种可能.(1)41x +有一次因式,从而它有有理根,但(1)0f ±≠,所以41x +无有理根.(2)41x +无一次因式,设4221()()x x ax b x cx d +=++++,其中,,,a b c d 为整数.于是0a c +=,0b d ac ++=,0ad bc +=,1bd =,又分两种情况:①1b d ==,又 a c =-,从而由 0b d ac ++=,得22a =,矛盾;②1b d ==-,则22a =-,矛盾.综合以上情况,即证.17. 求下列多项式的有理根:(1) 32()61514f x x x x =-+-;(2) 42()4751g x x x x =---;(3) 5432()614113h x x x x x x =+----.解 (1)由于()f x 是首项系数为1的整系数多项式,所以有理根必为整数根,且为14-的因数.14-的因数有:1,2,7,14±±±±,计算得到:故2x =是()f x 的有理根.再由多项式除法可知,2x =是()f x 的单根.(2) 类似(1)的讨论可知,()g x 的可能的有理根为:111,,24±±±,计算得到 111171111(1)9,(1)1,5,0,,22464464g g g g g g ⎛⎫⎛⎫⎛⎫⎛⎫=--==--==--=- ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭⎝⎭, 故12x =-是()g x 的有理根.再由多项式除法可知,12x =-是()f x 的2重根. (3) 类似地,()h x 的可能的有理根为:1,3±±,计算得到(1)28,(1)0,(3)0,(3)96h h h h =--==-=-.故1x =-,3x =是()h x 的有理根.再由多项式除法可知,1x =-是()h x 的4重根,3x =是()h x 的单根.18.若实系数方程30x px q ++=有一根a bi +(,a b 为实数,0b ≠),则方程30x px q +-=有实根2a .证明 设原方程有三个根123,,ααα.不失一般性,令1a bi α=+,从而有 2a bi α=-,由根与系数的关系可知 12330()()a bi a bi αααα=++=++-+,所以32a α=-,即3(2)(2)0a p a q -+-+=,故3(2)(2)0a p a q +-=.这说明30x px q +-=有实根2a .19. 证明:如果(1)()n x f x -,那么(1)()n n x f x -.证明 因为(1)()n x f x -,所以 (1)(1)0nf f ==.因此,令()(1)()f x xg x =-,则有 ()(1)()n n n f x x g x =-, 即(1)()n n x f x -.20. 下列多项式在有理数域上是否可约?(1) 21()1f x x =+;(2) 4322()8122f x x x x =-++;(3) 633()1f x x x =++;(4) 4()1p f x x px =++,p 为奇素数;(5) 45()41f x x kx =++,k 为整数.解 (1)1()f x 的可能的有理根为:1±,而(1)2f ±=,所以它在有理数域上不可约.(2)由Eisenstein 判别法,取素数2p =,则2不能整除1,而 2(8),212,22-,但是22不能整除2,所以该多项式在有理数域上不可约.(3)令1x y =+,代入633()1f x x x =++有654323()(1)615211893g y f y y y y y y y =+=++++++.取素数3p =,由Eisenstein 判别法知,()g y 在有理数域上不可约,所以()f x 在有理数域上不可约.(4) 令1x y =-,代入4()1p f x x px =++,得11222214()(1)()p p p p p p p p p g y f y y C y C y C y C p y p ----=-=-+--++-,取素数p ,由Eisenstein 判别法知,()g y 在有理数域上不可约,所以4()f x 在有理数域上不可约.(5) 令1x y =+,代入45()41f x x kx =++,得4325()(1)46(44)42g y f y y y y k y k =+=++++++,取素数2p =,由Eisenstein 判别法知,()g y 在有理数域上不可约,所以5()f x 在有理数域上不可约.B 组1.设()f x ,()g x ,()h x 是实数域上的多项式,(1) 若222()()()f x xg x xh x =+,则()()()0f x g x h x ===.(2) 在复数域上,上述命题是否成立?证明 (1)当()()0g x h x ==时,有2()0f x =,所以()0f x =,命题成立.如果()g x ,()h x 不全为零,不妨设()0g x ≠.当()0h x =时,()22()()12()xg x xh x g x ∂+=+∂为奇数;当()0h x ≠时,因为()g x ,()h x 都是实系数多项式,所以2()xg x 与2()xh x 都是首项系数为正实数的奇次多项式,于是也有22(()())xg x xh x ∂+为奇数.而这时均有2()0f x ≠,且2()2()f x f x ∂=∂为偶数,矛盾.因此有()()0g x h x ==,从而有()0f x =.(2) 在复数域上,上述命题不成立.例如,设()0f x =,()n g x x =,()i nh x x =,其中n 为自然数,有222()()()f x xg x xh x =+,但()0g x ≠,()0h x ≠.2. 设(),(),()[]f x g x h x P x ∈,满足 2(1)()(1)()(2)()0x h x x f x x g x ++-++=,2(1)()(1)()(2)()0x h x x f x x g x ++++-=.证明()2(1)(),()x f x g x +.证明 两式相加得到22(1)()2(()())0x h x x f x g x +++=.由2(1,)1x x +=可知 ()2(1)()()x f x g x ++.两式相减得到2()4()0,()2()f x g x f x g x -+==. 故()()221(),1()x f x x g x ++,即()()21(),()x f x g x +.3.设1212()()()()g x g x f x f x ,证明(1) 若11()()f x g x ,1()0f x ≠,则22()()g x f x ;(2) 若212()()()g x f x f x ,是否有22()()g x f x ?解 (1) 因为1212()()()()g x g x f x f x ,11()()f x g x ,故存在多项式()h x ,1()h x 使得1212111()()()()(),()()()f x f x g x g x h x g x f x h x ==.于是12112()()()()()()f x f x f x h x g x h x =.由于1()0f x ≠,故有212()()()()f x h x g x h x =,即22()()g x f x .(2) 否.例如取1()2g x x =-,22()1g x x =-,1()(1)(2)f x x x =--,2()(1)(2)f x x x =++.虽然1212()()()()g x g x f x f x 且212()()()g x f x f x ,但2()g x 不能整除2()f x .4.当k 为何值时,2()(6)42f x x k x k =++++和2()(2)2g x x k x k =+++的最大公因式是一次的?并求出此时的最大公因式.解 显然()()(2)g x x k x =++.当()(),()2f x g x x =+时,(2)42(6)420f k k -=-+++=,则3k =.当()(),()f x g x x k =+时,2()(6)420f k k k k k -=-+++=,则1k =.这时()(),()1f x g x x =+. 5.证明:对于任意正整数n ,都有 ()()(),()(),()n n n f x g x f x g x =.证明 由题意可知()f x 与()g x 不全为零.令()(),()()f x g x d x =,则()0d x ≠,从而()(),1()()f x g x d x d x ⎛⎫= ⎪⎝⎭,所以对任意正整数n ,有()(),1()()n n f x g x d x d x ⎛⎫⎛⎫⎛⎫ ⎪= ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭,于是有 ()()()()1()()n nf xg x u x v x d x d x ⎛⎫⎛⎫+= ⎪ ⎪⎝⎭⎝⎭,即 ()()()()()n n n u x f x v x g x d x +=. 又由()()d x f x ,()()d x g x ,有()()n n d x f x ,()()n n d x g x ,因此()n d x 是()n f x 与()ng x 的首项系数为1的最大公因式,从而有 ()()(),()()(),()nn n n f x g x d x f x g x ==. 6. 设11()()(),()()(),f x af x bg x g x cf x dg x =+=+且0ad bc -≠,证明()()11(),()(),()f x g x f x g x =.证明 设()(),()()f x g x d x =,则()(),()()d x f x d x g x .由于1()()()f x af x bg x =+,1()()()g x cf x dg x =+, 故11()(),()()d x f x d x g x .又设11()(),()()h x f x h x g x ,由上式及0ad bc -≠,可得11()()()d b f x f x g x ad bc ad bc =---, 11()()()c a g x f x g x ad bc ad bc-=+--, 从而 ()(),()()h x f x h x g x ,于是 ()()h x d x ,即()d x 也是1()f x 和1()g x 的最大公因式,即()()11(),()(),()f x g x f x g x =.7.设1()()()f x d x f x =,1()()()g x d x g x =,且()f x 与()g x 不全为零,证明()d x 是()f x 与()g x 的一个最大公因式的充分必要条件是()11(),()1f x g x =.证明 必要性.若()d x 是()f x 与()g x 的一个最大公因式,则存在多项式(),()u x v x 使()()()()()u x f x v x g x d x +=,于是11()()()()()()()u x d x f x v x d x g x d x +=.由()f x 与()g x 不全为零知()0d x ≠,因此有11()()()()1u x f x v x g x +=,即()11(),()1f x g x =.充分性.若()11(),()1f x g x =,则存在多项式(),()u x v x ,使11()()()()1u x f x v x g x +=.两边同时乘()d x 有()()()()()u x f x v x g x d x +=.由()d x 是()f x 与()g x 的一个公因式知,()d x 是()f x 与()g x 的一个最大公因式.8.设()f x 和()g x 是两个多项式,证明()(),()1f x g x =当且仅当()()(),()()1f x g x f x g x +=. 证明 必要性.设()(),()1f x g x =,若()()f x g x +与()()f x g x 不互素,则有不可约公因式()p x ,使()()()p x f x g x , 所以()()p x f x 或()()p x g x .不妨设()()p x f x ,由()()()()p x f x g x +可知()()p x g x ,因此()p x 是()f x 和()g x 的公因式,与(),()f x g x 互素矛盾,故()()f x g x +与()()f x g x 互素.充分性.设(()(),()())1f x g x f x g x +=,则存在(),()u x v x 使()()()()()()()1f x g x u x f x g x v x ++=,()()()()()()()1f x u x g x u x f x v x ++=,上式说明()(),()1f x g x =.9. 如果23312(1)()()x x f x xf x +++,那么1(1)()x f x -,2(1)()x f x -.证明 21x x ++的两个根为1ε=和2ε=33121εε==. 因为()23312(1)()()x x f x xf x +++,所以331212()()()()x x f x xf x εε--+,故有即解得12(1)(1)0f f ==,从而1(1)()x f x -,2(1)()x f x -.10. 若()()n f x f x ,则()f x 的根只能是零或单位根.证明 因为()()n f x f x ,故存在多项式()q x ,使()()()n f x f x q x =.设a 为()f x 的任一根,即()0f a =,则()()()0n f a f a q a ==.也就是说,当a 为()f x 的一根时,n a 也为()f x 的一根.依此类推,可知2,,,n n a a a 也是()f x 的根.由于()f x 的根的个数有限,故必定存在正整数,s t (不妨设s t >),使得s t n n a a =,(1)0t s t n n n a a --=.于是有0t n a =即0a =,或者(1)0s tn n a --=,即a 为单位根. 11. 设()f x 是一个整系数多项式,且(0),(1)f f 都是奇数,则()f x 没有整数根.证明 设10()n n f x a x a x a =+++,假设()f x 有整数根α,则x α-整除()f x ,即()()()f x x q x α=-,其中商式()q x 也是一个整系数多项式.事实上,设1110()n n q x b x b x b --=+++,代入上式并比较两端同次幂系数,得112110100,,,,n n n n n a b a b b a b b a b ααα----==-=-=-, 因为()f x 是一个整系数多项式,所以,110,,,n b b b -也是整数,令0,1x x ==分别代入展开式,得 (0)(0),(1)(1)(1)f q f q αα=-=-.由于(0),(1)f f 都是奇数,则α及1α-都必须是奇数,这是不可能的,所以,()f x 不能有整数根.12.证明对于任意非负整数n ,都有 ()()22211(1)n n x x x x ++++++. 证明 设α是21x x ++的任一根,即 210αα++=,21αα+=-,31α=.由此得221222123(1)()(1)0n n n n n n αααααα+++++++=+-=-=,即α也是221(1)n n x x ++++的根.又因为21x x ++无重根,因此()()22211(1)n n x x x x ++++++.13. 假设12,,,n a a a 是两两不同的整数,证明:多项式12()()()()1n f x x a x a x a =----在有理数域上不可约.证明 用反证法.假设()f x 在有理数域上可约,则有整系数多项式12(),()g x g x ,使得12()()()f x g x g x =.于是12()()()i i i f a g a g a =,1,2,,i n =.因此,12()1,()1i i g a g a ==-或12()1,()1i i g a g a =-=.这样总有12()()i i g a g a =-,从而由推论2知12()()g x g x =-,所以21()()f x g x =-.这与()f x 的首项系数为1相矛盾,故()f x 在有理数域上不可约.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一元多项式相加问题
# include<iostream.h>
typedef struct node{
float coef;
int exp;
int flg;
struct node *next;
}PolyNode,*PolyList;
PolyNode *head_a,*head_b,*head_c;
PolyList A,B,C;
PolyNode *Creat_PolyNode()
{
PolyNode *s,*r;
PolyList L;
float x;int y;
L=new PolyNode;
L->next=NULL;
r=L;
cin>>x>>y;
while(x||y) //输0的时候输入【0,另一个链表有的指数】{
s=new PolyNode;
s->coef=x;
s->exp=y;
r->next=s;
r=s;
cin>>x>>y;
}
r->next=NULL;
return L;
}
void Out_PolyNode(PolyNode *L,float a[100],int b[100]) {
PolyNode *p;int i=0,j=0;
p=L->next;
if(p==NULL)
cout<<"0";
while(p)
{
a[i]=p->coef;
b[i]=p->exp;
p=p->next;
i++,j++;
}
for(i=0;i<j;i++)
cout<<"["<<a[i]<<","<<b[i]<<"]"<<" ";
cout<<endl;
}
PolyNode *Plus_PolyNode(PolyNode *A,PolyNode *B) {
PolyNode *r,*p,*q,*s,*L;
L=new PolyNode;
r=L;
p=A->next,q=B->next;
while(p&&q)
{
if(p->exp==q->exp)
{
s=new PolyNode;
s->coef=p->coef+q->coef;
if(s->coef==0)
{
p=p->next;
q->flg=1;
}
else
{
s->exp=p->exp;
r->next=s;
r=s;
p->flg=1;
q->flg=1;
p=p->next;
q=B->next;
}
}
else if(p->exp!=q->exp&&q->next==NULL)
{
s=new PolyNode;
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p->flg=1;
p=p->next;
q=B->next;
}
else
q=q->next;
}
q=B->next;
while(q)
{
if(q->flg!=1)
{
s=new PolyNode;
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q->flg=1;
}
q=q->next;
}
r->next=NULL;
return L;
}
void main()
{
PolyNode *A,*B,*C;float a[100];int b[100];
cout<<"输入第一个多项式,按系数-指数形式输入子项"<<endl;
A=Creat_PolyNode();
cout<<"输出一元多项式"<<endl;
Out_PolyNode(A,a,b);
cout<<"输入第二个多项式,按系数-指数形式输入子项"<<endl;
B=Creat_PolyNode();
cout<<"输出一元多项式"<<endl;
Out_PolyNode(B,a,b);
C=Plus_PolyNode(A,B);
cout<<"两式多项式相加得"<<endl;
Out_PolyNode(C,a,b);
}。