多项式求和
- 格式:doc
- 大小:74.50 KB
- 文档页数:6
一元多项式相加问题实验报告一元多项式相加问题一、问题描述通过键盘输入两个形如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 为头指针的一个新链表中。
完整word版一元多项式求和实验报告范文_实验一、线性结构综合应用一、实验题目:顺序表的应用二、实验内容:一元多项式求和。
把任意给定的两个一元多项式P(某),Q(某)输入计算机,计算它们的和并输出计算结果。
三、设计分析:实现要定义的一元多项式应采用链式存储结构。
根据一元多项式相加的运算法则,对于两个多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成新多项式的一项;对于两个多项式中所有指数不同的项,分别复制到新多项式中。
新多项式不必另外生成,而是在原来的两个多项式中摘取结点即可。
采用顺序存储结构存储多项式系数A,使多项式的某些运算变得更简洁。
但在实际使用时,多项式的阶数可能很高,不同的多项式阶数可能相差很大,这使顺序存储结构的最大长度难以确定。
而且,最高次幂与最低次幂项之间缺项很多时,采用顺序存储结构显然十分浪费存储空间,因此,一般情况下多采用链式存储结构来存储高阶多项式。
在用线性链表来存储一个多项式时,多项式中的每个非零项系数对应一个结点,结点由数据元素项和指针组成。
数据元素项中包含系数和指数值,设计中先定义定义数据元素中的数据,其中有指数、系数级指针ne某t等。
并要先构造一元多项式。
在定义输出、删除、合并等模块。
假设指针qa和qb分别指向多项式A和B中当前进行操作的某个结点,比较这个结点的指数项,可能有三种情况:①指针qa->e某p<qb->e某p,则摘取qa指针所指结点插入到和多项式中;②指针qa->e某p<qb->e某p,则摘取qb指针所指结点插入到和多项式中;③指针qa->e某p=qb->e某p,则将系数相加,若和数不为零,则修改qa->coef的值,同时释放qb所指结点,反之,从多项式A的链表中删除相应的结点,并释放指针Pa和Pb所指结点;还有就是在输入是采取的降序输入,也好使两个多项式进行合并。
并输出。
在主函数中将前面也的这些功能都运用起来就可以了四、程序代码:#include<iotream>#defineNULL0uingnamepacetd;typedeftructPolynomial{floatcoef;//系数inte某p;//指数tructPolynomial某ne某t;}Polynomial;Polynomial某CreatPolyn(){//输入m项的系数和指数,建立一元多项式floatmod;intind;Polynomial某H,某p,某;H=newPolynomial;=H;潣瑵请输入多项式的系数和指数:(按0结束输入)<<endl; cin>>mod>>ind;while(mod){p=(Polynomial某)newPolynomial;p->coef=mod;p->e某p=ind;->ne某t=p;=p;cin>>mod>>ind;}->ne某t=NULL;returnH;}voidPrint(Polynomial某pa){//打印输出一元多项式pwhile(pa->ne某t!=NULL){pa=pa->ne某t;cout<<pa->coef<<某某^<<pa->e某p;if(pa->ne某t!=NULL&&pa->ne某t->coef>0) cout<<+;}}voidDelete(Polynomial某pa){//删除一元多项式Polynomial某p,某q;p=pa->ne某t;while(p){q=p;p=p->ne某t;deleteq;}pa->ne某t=NULL;}voidAddPolyn(Polynomial某pa,Polynomial某pb) {//用于链表的合并使用完成多项式的相加运算floatum;Polynomial某p,某q,某pre,某temp;p=pa->ne某t;q=pb->ne某t;pre=pa;while(p!=NULL&&q!=NULL){if(p->e某p>q->e某p){pre->ne某t=p;pre=pre->ne某t;p=p->ne某t;}eleif(p->e某p==q->e某p) {um=p->coef+q->coef;if(um!=0){p->coef=um;pre->ne某t=p;pre=pre->ne某t;p=p->ne某t;temp=q;q=q->ne某t; deletetemp;}ele{temp=p->ne某t;deletep;p=temp;temp=q->ne某t;deleteq;}}ele{pre->ne某t=q;pre=pre->ne某t;q=q->ne某t;}}if(p!=NULL)//将多项式A中剩余的结点加入到和多项式中pre->ne某t=p;elepre->ne某t=q;}intmain(){intc;intt=1;cout<<某某某某某某某某某某某某某某某某某某菜单某某某某某某某某某某某某某某某某某<<endl<<endl;cout<<.创建并显示一元多项式A和B,计算一元多项式A加B并显示和<<endl<<endl;cout<<.退出程序.<<endl;cin>>c;witch(c){cae1:Polynomial某p1,某p2;p1=CreatPolyn();潣瑵一元多项式A是:;Print(p1);cout<<endl;p2=CreatPolyn();潣瑵一元多项式B是:;Print(p2);cout<<endl;AddPolyn(p1,p2);潣瑵一元多项式A加B的和是:;Print(p1);cout<<endl;Delete(p1);break;cae2:t=0;break;}}ytem(paue);return0;}五、测试用例:六、实验总结通过这次实验,对于链表的应用知识有了更加深刻的认识,虽然中间出了很多问题,但是经过调试以后都得以解决。
线性表——⼀元多项式的求和♥注:未经博主同意,不得转载。
多项式的表⽰与求和是线性表应⽤的典型案列。
在数学上,⼀元多项式P(x)的表⽰为:P(x)=a0+a1x+a2x2+…+anxn其中,n为⼤于或等于0的整数,表⽰x的幂:a o,a1,…a n为系数,a n≠0,a0,a1,…,a n-1可以为0,也可以不为0。
⼀元多项式的表⽰ 为了表⽰⼀元多项式,可以将其所有项的系数⽤⼀个线性表来表⽰:(a0,a1,…,a n)。
这个线性表可以使⽤顺序存储结构或链式存储结构来存储,从⽽进⾏多项式的有关运算。
若采⽤顺序存储结构,可使⽤⼀个⼀维数组存储这个线性表,即多项式的系数,⽽相应的幂则使⽤数组下标来表⽰。
⼀元多项式的顺序存储结构如下:1 typedef int DataType;2const int MaxPolySize=100;34class Polyn5 {6private:7 DateType data[MaxPolySize];8int size; //元素的个数910public:11 Polyn(){size = 0;} //构造⼀个空多项式12 ~Polyn();1314void Clear(){size=0;} //清空15 Polyn sum(Polyn a); //多项式相加16 Polyn sub(Polyn a); //多项式相减17 }; 但多项式的顺序存储有⼀个缺点:当存储形如P(x)=1+10x99的多项式时,由于a1到a98均为0,所以⽤来存储⼀元多项式的⼀维数组中的绝⼤部分单元存储的值都是0,导致存储效率低下,造成存储空间的浪费。
因此,⼀般采⽤链式存储结构来描述⼀元多项式。
⼀元多项式的链式存储必须显式地表达系数值和幂值,这是由于链式存储打破了顺序存储中原有的幂与数组下标间的⼀⼀对应关系,⼀元多项式的项的结点结构表⽰如图所⽰。
⼀元多项式的链式存储结构表⽰如下:12struct term3 {4double coef; //系数5int expn; //指数6 };7struct PNode8 {9 term data;10 PNode *next;11 };12class Ployn13 {14 PNode *phead;15public:16 Polyn()17 { //构造函数18 phead =new PNoed;19if(phead= =NULL)20 exit(0);21 phead->next=NULL;22 }23 ~Polyn(); //析构函数2425void PolynAdd(Ployn Pa,Ployn Pb); //两个多项式相加26void Print(); //打印多项式27void Create(); //建⽴多项式28 };29⼀元多项式的求和 本节以多项式的加法为例,讲述⼀元多项式操作的实现。
探索探索与与研研究究在习题训练时,我们经常会遇到数列求和问题,其中多项式数列求和问题属于难度较大的一类题目.由于解答此类问题过程中的运算量较大,因而很多同学经常得不到正确的答案.事实上,我们可以利用不定积分来解答多项式数列求和问题.仔细观察数列{}n 2的前n 项和公式与函数y =x 2的不定积分,可以发现二者之间存在很多相似之处:(1)都是三次式;(2)三次式最高次项的系数都为13.这给了我们一个启示:多项式数列的前n 项和公式与对应的多项式函数不定积分之间有很多相同的地方.观察∑i =1ni =n (n +1)2,∑i =1n i =n (n +1)()2n +16,∑i =1n i =éëêùûún (n +1)22,可发现多项式数列的特点,可以得到下面的定理.定理1:若f k (n )=∑i =1ni k,k ∈N,则f k (n )必含有因子n .证明:采用数学归纳法证明.①当k =0时,f 0(n )=n ,结论成立.②假设当k ≤m ,m ∈N 时,结论成立,那么k =m +1时,由(n +1)m +2-n m +2=C m +1m +2n m +1+C m m +2nm+⋯+C 2m +2n 2+C 1m +2n +1,得∑i =1n []()i +1m +2-im +2=∑i =1n (Cm +1m +2im +1+C m m +2i m +⋯+C 2m +2i2+C1m +2i +1,∴(n +1)m +2-1=(m +2)∑i =1n im +1+Cm m +2∑i =1nim +1+⋯+C2m +2⋅∑i =1ni2+C 1m +2∑i =1ni +n ,∴∑i =1n i m -1=1m +2⋅éëê(n +1)m +2-1-æèçC mm +2∑i =1ni m +⋯+C 2m +2⋅ùûúöø÷∑i =1ni 2+C 1m +2∑i =1ni +n (*),右边显然含有因子n ,故左边也含有因子n .由①②得,f k (n )中必含有因子n .证毕.定理2:f k (n )=∑i =1ni k ,k ∈N +,则f ′k (n )=∑i =1n(i k )′+B k =k ⋅∑i =1n ik -1+B k ,其中B k 是常数.若B 0=1,则∑i =0nC i nB i =∑i =0nC i n B i=n +B n ,∑i =0nC i n(-1)n -iB i =B n ,n ∈N.证明:采用数学归纳法证明.当k =1时,f 1(n )=n 2+n 2,f ′k (n )=n +12,又∑i =1ni 0+B 1=n +B 1,所以B 1=12,结论成立.假设k ≤m ,m ∈N +时,结论成立,则当k =m +1时,在(*)式的两边同时对n 求导,得æèçöø÷∑i =1n i m +1′n =1m +2⋅éëê(n +1)m +2-1-æèçC m m -2∑i =1n i m +⋯+ùûúöø÷C 2m +2∑i =1ni 2+C 1m +2∑i =1ni +n ′n.可得æèçöø÷∑i =1n i m +1′n=(n +1)m +1-1m +2æèçC m m +2∑i =1n (i m )′+⋯+öø÷C2m +2∑i =1n (i 2)′+C 1m +2∑i =1n(i )′+C ,其中C =C m m +2B m +C m -1m +2B m -1+⋯+C 2m +2B 2+C 1m +2B 1+B 0,化简右边的式子得:æèçöø÷∑i =1n i m +1′=(m +1)∑i =1n i m +1-Cm +2.显然1-Cm +2是一个常数,记为B m +1.于是B m +1=1-Cm +2,即(m +2)B m +1=(m +2)-(C m m +2B m +⋯+C 2m +2B 2+C 1m +2⋅B 1+B 0),⇔C m m +2B m +1+(C m m +2B m +⋯+C 2m +2B 2+C 1m +2B 1+B 0)=m +2,⇔C m +2m +2B m +2+C m +1m +2B m +1+(C m m +2B m +⋯+C 2m +2B 2+C 1m +2B 1+B 0)=B m +2+(m +2),⇔∑i =0m +2C i m +2B i =(m +2)+B m +2,m ∈N +,(1)所以结论成立.证毕.通过证明可得∑i =0m +2(-1)m +2-i C im +2B i =B m +2,m ∈N +,(2)令B 0=1,B 1=12,B k =B k,那么(1)(2)式就变为:ìíî(B +1)n =B n +n ,(B -1)n=B n (n ≠1),n ∈N +,令n =2k ,k ≥2,得ìíîïï(B +1)2k =C 2k 2k B 2k +C 2k -12k B 2k -1+⋯+C 22kB 2+C 12kB 1+B 0=B 2k+2k ,(B -1)2k=C 2k 2kB 2k-C 2k -12kB 2k -1+⋯+C 22kB 2-C 12kB 1+B 0=B 2k,将两式相减得,2C 2k -12k B 2k -1+2C 2k -32k B 2k -3+⋯+C 32k B 3+2C 12k B 1=2k ,53探索探索与与研研究究又B 1=12,所以2C 2k -12k B 2k -1+2C 2k -32k B 2k -3+⋯+2C 32k B 3=0,依次令k =2,3,4,⋯,得B 3=B 5=B 7=⋯=0.可得数列{B k }前几项为:B 0=1,B 1=12,B 2=16,B 3=0,B 4=-130,B 5=0,B 6=142,⋯,数列{B k }就是伯努利数列,对应的递推公式为(B +1)n =B n (n ≠1),(B -1)n =B n +(-1)n n ,n ∈N .通过进一步研究,就可以得到公式∑i =1ni k =1k +1⋅[(B +n )k +1-B k +1].该式为1713年雅格布·伯努力著的《猜度术》中的方幂和公式.定理3:g (n )是多项式,f (n )=∑i =1n g (i ),则ìíîïïïïf ′(n )=∑i =1ng ′(i )+f ′(0),f (1)=g (1),f (0)=0,证明:由定理1得,∑i =1n g (i )中必含有因子n ,所以f (0)=0.而f (1)=g (1),由定理2得f ′(n )=∑i =1n g ′(i )+C .由定理1得∑i =1ng ′(i )中必含有因子n ,所以当n =0时,f ′(0)=0+C .所以f ′(n )=∑i =1n g ′(i )+f ′(0),证毕.推论1:g (n )是多项式,f (n )=∑i =1n g (i ),则一定有ìíîïïïïïïïïf ″(n )=∑i =1ng ″(i )+f ″(0),f ′(1)-f ′(0)=g ′(1),f (1)=g (1),f (0)=0.推论2:g (n )是多项式,f (n )=∑i =1n g (i ),则一定有ìíîïïïïïïïïïïïïïïïïïïïïf (k )(n )=∑i =1ng (k )(i )+f (k )(0),f (k -1)(1)-f (k -1)(0)=g (k -1)(1),f (k -2)(1)-f (k -2)(0)=g (k -2)(1),⋯f ″(1)-f ″(0)=g ″(1),f ′(1)-f ′(0)=g ′(1),f (1)=g (1),f (0)=0.这里运用导数的运算性质、不定积分公式、数学归纳法以及组合知识得到了伯努利数的递推公式,并通过进一步研究得到了方幂和的通项公式.由定理3、推论1、推论2可知,求高次多项式数列的和,要先对数列通项公式求导,再求和,最后用不定积分公式∫x k d x =1k +1x k +1+C,解微分方程就可以得到f (n )了.例题:(2020全国文数卷I,第16题)数列{a n }满足a n +2+(-1)n a n =3n -1,前16项和为540,则a 1=_____.解:令n =2k -1,k ∈N +,得a 2k +1-a 2k -1=6k -4,a 2k +1=(a 2k -1-a 2k -3)+(a 2k -3-a 2k -5)+⋯+(a 3-a 1)+a 1=(6k -10)+(6k -16)+⋯+2+a 1=(6k -10+2)(k -1)2+a 1=3k 2-7k +4+a 1,令h (k )=∑i =1ka 2i -1=∑i =1k(3i 2-7i +4+a 1),∴h (k )必含有因子k ,且有h ′(k )=∑i =1k(3i 2-7i +4+a 1)′+h ′(0)=∑i =1k(6i -7)+h ′(0)=3k 2-4k +h ′(0),∴h (k )=∫[3k 2-4k +h ′(0)]d x =k 3-2k 2+h ′(0)k .令n =2k ,k ∈N +,得a 2k +2+a 2k =6k -1,即a 2k +2-3(k +1)+2=-(a 2k -3k +2).∴a 2k -3k +2=(a 2-1)(-1)k -1,∴∑i =1ka 2i =∑i =1k[3i -2+(a 2-1)(-1)i -1]=(3k -1)k 2+(a 2-1)⋅1-(-1)k2.∑i =116a i=∑i =18a2i -1+∑i =18a 2i =h (8)+23×82=540,即83-2×82+h ′(0)⋅8+23×82=540,∴h ′(0)=8,∴h (k )=k 3-2k 2+8k ,∴a 1=h (1)=7解答本题,需根据定理1、定理2得到∑i =1ka 2i -1=k 3-2k 2+h ′(0)k 的表达式,这是是解答本题的关键.然后根据定理3、推论2,通过求不定积分得到h (k )的表达式,进而求得a 1的值.运用不定积分求高次多项式数列的和,关键要建立数列的前n 项和与多项式函数不定积分之间的联系,根据上述3个定理得出多项式函数f (n )=∑i =1ng (i ),然后通过求不定积分,求得数列的前n 项和.(作者单位:江西省赣州市南康区第三中学)54。
#include<stdio.h>#define MAXLEN 100typedef struct{int data[MAXLEN];int last;}SeqList;void create_list(SeqList *D){ int n,i;printf("请按多项式X的最高次数:");scanf("%d",&n);for(i=MAXLEN-1;i>=0;i--)D->data[i]=0;printf("请输入多项式X的系数,缺少该项请输入0:\n");for(i=n;i>=0;i--){ printf("输入X^%d项的系数: ",i);scanf("%d",&D->data[i]);}D->last=n;}void add_List(SeqList A, SeqList B, SeqList *C){ int i;C->last=st>st? st:st;for(i=0;i<=C->last;i++)C->data[i]=A.data[i]+B.data[i];}void Show(SeqList C){int i,n=1; //项数计数for(i=st;i>=0;i--){if(C.data[i]==0) continue;if(C.data[i]>0&&n!=1) putchar('+');if(C.data[i]!=1&&C.data[i]!=-1){printf("%d",C.data[i]);if(i==1) putchar('X');else if(i) printf("X^%d",i);}else{if(C.data[i]==1){if(!i) putchar('1');else if(i==1) putchar('X');else printf("X^%d",i);}if(C.data[i]==-1){if(!i) printf("-1");else if(i==1) printf("-X");else printf("-X^%d",i);}}n++;}printf("\n");}void main(){ SeqList A,B,C;printf("生成多项式f(X):\n");create_list(&A);printf("f(X)=");Show(A);printf("生成多项式g(X):\n");create_list(&B);printf("g(X)=");Show(B);printf("多项式f(X)和g(X)的和\n ");add_List (A,B,&C);printf("f(X)+g(X)=");Show(C);}。
两多项式求和(C语言版)#include "stdlib.h"#include "stdio.h"# define OVERFLOW -2typedef struct term{ float coef; //多项式系数int expn; //多项式指数struct term *next;} node;node *Create(int n)//创建一个n个结点的链表,并给每//个节点数据域赋值{ node *head, *p, *q;//int i;head=(node *)malloc(sizeof(node));if(!head) { printf("分配内存失败!");exit(OVERFLOW);}for(i=0;i<n;i++)< p="">{ p=(node *)malloc(sizeof(node));if(!p){ printf("分配内存失败!");exit(OVERFLOW);}printf("请输入第%d项系数:\n",i+1);//从键盘读取数据scanf("%f",&p->coef);printf("请输入第%d项指数:\n",i+1);scanf("%d",&p->expn);//从键盘读取数据if(i==0)//如果是第一个节点,则指针q、head同时指向该第一个实节点head->next=q=p;else //否则一个节点一个节点往后接{ q->next=p;p->next=NULL;q=p;}}return(head);//返回所建链表头指针}int cmp (node *m,node *n )//比较两个指数大小,并返回-1或0或1 { if(m->expnexpn)return -1;else if(m->expn==n->expn)return 0;elsereturn 1;}float Sum(node *m,node *n)//求多项式两个系数之和{ return m->coef+n->coef;}node *Add (node *a,node *b )//两个多项式相加{ node *ha,*hb,*pa,*pb,*tmpb;int t;ha=a;hb=b;while(ha->next!=NULL) {pa=ha->next;pb=hb->next;tmpb=hb;while(tmpb->next!=NULL){t=cmp(pa,pb);if(t==0){ (pa->coef)+=(pb->coef);pb=pb->next;tmpb->next=pb;}if(t!=0){tmpb=pb;pb=pb->next;}}ha=ha->next;}if(hb->next!=NULL)//如果多项式b还有某些项未执行相加操作,//则将其接到结果多项式a后面ha->next=hb->next;return a;//返回结果多项式}int main(){ node *x,*y,*p,*hp;int m=0,n=0;char c1,c2;printf("请输入第一个多项式的项数!\n");scanf("%d",&m);printf("请输入第一个多项式\n\n");x=Create(m);printf("请输入第二个多项式的项数!\n");scanf("%d",&n);printf("请输入第二个多项式\n\n");y=Create(n);p=Add(x,y );printf("两个多项式相加成功,其结果如下:\n"); while(p->next!=NULL)//输出相加所得的多项式{ printf("%5.1f",p->next->coef);if(p->next->expn!=0)printf(" * X(%d)",p->next->expn);p=p->next;if(p->next!=NULL)printf(" + ");}c1=getchar();c2=getchar();if(c2=='\n')printf("\n");return 0;}</n;i++)<>。
二元多项式求和
二元多项式求和是高中数学中的一个重要知识点,也是数学中的一种基本运算。
在学习二元多项式求和时,我们需要掌握二元多项式的定义、二元多项式的加减法、二元多项式的乘法等知识点。
我们来了解一下什么是二元多项式。
二元多项式是指含有两个变量的多项式,通常用x和y表示。
例如,3x^2y+2xy^2-5x^2y^2就是一个二元多项式。
接下来,我们来看一下二元多项式的加减法。
二元多项式的加减法与一元多项式的加减法类似,只需要将同类项合并即可。
例如,将3x^2y+2xy^2-5x^2y^2和4x^2y-3xy^2+2x^2y^2相加,我们可以先将同类项合并,得到7x^2y-xy^2-3x^2y^2。
我们来看一下二元多项式的乘法。
二元多项式的乘法需要用到分配律和结合律,具体步骤如下:
1. 将两个二元多项式中的每一项相乘,得到一系列的单项式。
2. 将这些单项式按照x和y的次数进行合并,得到一个新的二元多项式。
例如,将(3x+2y)(4x-5y)相乘,我们可以先将每一项相乘,得到12x^2-15xy+8xy-10y^2,然后将同类项合并,得到12x^2-7xy-10y^2。
二元多项式求和是高中数学中的一个重要知识点,需要我们掌握二元多项式的定义、二元多项式的加减法、二元多项式的乘法等知识点。
只有掌握了这些知识点,我们才能够在数学学习中更加得心应手。
数据结构多项式相加实验报告篇一:数据结构实验多项式加法数据结构实验报告实验名称:多项式加减法学号:1XX10419姓名:林强实验日期:XX.5.05一、实验目的通过实现多项式的加减法,对链表有更深入的了解二、实验具体内容1、实验题目1:(1)题目设计一个一元稀疏多项式简单的加减法计算器实现要求:一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式:A(x)?7?3x?9x8?5x17;B(x)?8x?22x7?9x8(2)输出多项式(3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C(4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D(2)分析1:本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型,指数为整数,输出的结果也为系数和指数。
(1)输入的形式和输入值的范围:输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。
输入值的范围:a为实数,b为整数。
(2)输出形式:输出多项式的系数和多项式未知数X 的指数即(a,b)形式。
(3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果2:整个程序运行期间实行动态创建节点,一边输入数据,一边创建节点当将全部数据输入到单链表中后再调用多项式加法这个函数,并一边实现多项式的相加,一边释放节点,有效防止了在程序反复运行过程中可能出现系统空间不够分配的现象(3)实验代码typedef int Status;#define OVERFLOW -1#define null 0typedef struct Lnode{float coef; //存储项系数int expn;//存储项指数struct Lnode *next;}Lnode,*LinkList;typedef LinkList polynomial;Status InitList_L(LinkList &L) {//初始化头节点L=(LinkList)malloc(sizeof(Lnode));if(!L)return(-1);L->next=null;return 1;}void AddPolyn(polynomial pa, polynomial pb){ //实现两个多项式相加的算法float x;polynomial qa;polynomial qb;polynomial s;polynomial u;qa=pa->next; qb=pb->next; s=pa;while(qa&&qb){if(qa->expnexpn){s=qa;qa=qa->next;}else if(qa->expn==qb->expn){x=qa->coef+qb->coef;if(x!=0){qa->coef=x;s=qa;qa=qa->next;u=qb;qb=qb->next;free(u);}else{s->next=qa->next;free(qa);qa=s->next;u=qb;qb=qb->next;free(u);}}else if(qa->expn>qb->expn){ u=qb->next;s->next=qb;s=qb;qb->next=qa;qb=u;}}if(qb)qa->next=qb;free(pb);}void main(){float a;int b;polynomial L1;polynomial L2; LinkList q;LinkList p;LinkList m;LinkList n;InitList_L(L1);q=L1;InitList_L(L2);p=L2;cout 请输入数据:" for(;;){ cin>>a;cin>>b;if(a==0&&b==0) break;m=new Lnode;m->coef=a;m->expn=b;q->next=m;q=m;q->next=null;}//循环输入第一个多项式的系数与指数for(;;){cin>>a;cin>>b;if(a==0&&b==0)break;n=new Lnode;n->coef=a;n->expn=b;p->next=n;p=n;p->next=null;}//循环输入第二个多项式的系数与指数AddPolyn(L1,L2);//调用多项式相加的算法while((L1->next)!=null){coutnext->coefnext->expn L1=L1->next;}//输出计算结果}三、实验小结通过编写多项加法这个程序,我将自己所学到的创建链表,初始化链表和多项式加法算法都应用了一次,这使我们不仅仅只是理论化的学习书本上的知识,而是将学习到的理论知识应用到实际的操作中来增强我们的实际操作能力,这使我增加了实际操作经验,也使我通过实际操作来认识到自己在程序编写上的不足从而增强了我的实际编写程序的能力。
程序设计实践(大作业)两个多项式求和问题描述:通常在数学中对一元n次多项式可表示成如下形式:给定一个多项式,在C语言中可以用可读的形式将该多项式规范地输出。
例如,给出系数1 5 22 4 33 3 1 1 -1 0,输出为x^5+22x^4+33x^3+x-1。
所使用的规则如下:(1)多项式各项按照指数的递减顺序输出(2)次数出现在^之后,如3x^2(3)常数项仅输出常数。
(4)如果所有的项都是以0作为系数,则仅输出常数0,否则输出非零系数的项。
(5)如果第1项的系数是正数,在该项前没有符号;如果第1项的系数是负数,在该项前是减号,如2x^4+3x^2-10,-2x^4+3x^2-10。
(6)非常数项系数为1和-1不用显示,如x^7-10x^2,-x^2-x+2。
对每一项输入系数和指数。
按指数从高到低的顺序输入。
系数和指数的大小都在【-100,+100】之间。
输入-9999时一个多项式结束。
输出:先输出2个多项式,再输出求和后的多项式。
每个式子占据一行。
每一组输入对应的输出包括三行,包括2个多项式以及求和后的多项式。
每个式子占据一行。
例:Input:1 32 2 -8 0 -99991 1023 6 0 -99991 172 10 -9 5 0 2 23 -1 -1 -3 -9999-1 17 -3 9 2 6 7 5 3 -1 -9999Output:A:x^3+2x^2-8B:x^10+2x^3+6A+B:x^10+3x^3+2x^2-2A:x^17+2x^10-9x^5+23x^-1-x^-3B:-x^17-3x^9+2x^6+7x^5+3x^-1A+B:2x^10-3x^9+2x^6-2x^5+26x^-1-x^-3代码:#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;int main(){int x,y; //cishu +100;int i=0;int couna=0,counb=0;int na[300];int nb[300];int nc[300];int flag;while (scanf("%d",&x)!=EOF){flag=0;memset(na,0,sizeof(na));memset(nb,0,sizeof(nb));memset(nc,0,sizeof(nc));while (x!=-9999){scanf("%d",&y);na[y+100]=x;couna++;scanf("%d",&x);}scanf("%d",&x);while (x!=-9999){scanf("%d",&y);nb[y+100]=x;counb++;scanf("%d",&x);}printf("A:");for(i=200;i>=0;i--){if(flag==0&&na[i]!=0){if(i==100){if(na[i]>0)p rintf("%d",na[i]);else printf("%d",na[i]);}else if(i==101){if(na[i]==1)printf("x");else if(na[i]==-1)printf("-x");else if(na[i]>0)printf("%dx",na[i]);elseprintf("%dx",na[i]);}else if(na[i]==1)printf("x^%d",i-100);else if(na[i]==-1)printf("-x^%d",i-100);else if(na[i]>0)printf("%dx^%d",na[i],i-100);elseprintf("%dx^%d",na[i],i-100);flag++;}else if(na[i]!=0){if(i==100){if(na[i]>0)p rintf("+%d",na[i]);else printf("%d",na[i]);}else if(i==101){if(na[i]==1)printf("+x");else if(na[i]==-1)printf("-x");else if(na[i]>0)printf("+%dx",na[i]);elseprintf("%dx",na[i]);}else if(na[i]==1)printf("+x^%d",i-100);else if(na[i]==-1)printf("-x^%d",i-100);else if(na[i]>=0)printf("+%dx^%d",na[i],i-100);elseprintf("%dx^%d",na[i],i-100);}}if(flag==0)printf("\nB:");flag=0;for(i=200;i>=0;i--){if(flag==0&&nb[i]!=0){if(i==100){if(nb[i]>0)printf("%d",nb[i]);else printf("%d",nb[i]);}else if(i==101){if(nb[i]==1)printf("x");else if(nb[i]==-1)printf("-x");else if(nb[i]>0)printf("%dx",nb[i]);elseprintf("%dx",nb[i]);}else if(nb[i]==1)printf("x^%d",i-100);else if(nb[i]==-1)printf("-x^%d",i-100);else if(nb[i]>=0)printf("%dx^%d",nb[i],i-100);elseprintf("%dx^%d",nb[i],i-100);flag++;}else if(nb[i]!=0){if(i==100){if(nb[i]>0)printf("+%d",nb[i]);else printf("%d",nb[i]);}else if(i==101){if(nb[i]==1)else if(nb[i]==-1)printf("-x");else if(nb[i]>0)printf("+%dx",nb[i]);elseprintf("%dx",nb[i]);}else if(nb[i]==1)printf("+x^%d",i-100);else if(nb[i]==-1)printf("-x^%d",i-100);else if(nb[i]>=0)printf("+%dx^%d",nb[i],i-100);elseprintf("%dx^%d",nb[i],i-100);}}if(flag==0)printf("0");for(i=0;i<=200;i++){nb[i]=na[i]+nb[i];}flag=0;printf("\nA+B:");for(i=200;i>=0;i--){if(flag==0&&nb[i]!=0){if(i==100){if(nb[i]>0)printf("%d",nb[i]);else printf("%d",nb[i]);}else if(i==101){if(nb[i]==1)printf("x");else if(nb[i]==-1)printf("-x");else if(nb[i]>0)printf("%dx",nb[i]);elseprintf("%dx",nb[i]);}else if(nb[i]==1)printf("x^%d",i-100);else if(nb[i]==-1)printf("-x^%d",i-100);else if(nb[i]>=0)printf("%dx^%d",nb[i],i-100);elseprintf("%dx^%d",nb[i],i-100);flag++;}else if(nb[i]!=0){if(i==100){if(nb[i]>0)printf("+%d",nb[i]);else printf("%d",nb[i]);}else if(i==101){//printf("nb[i]:%d\n",nb[i]);if(nb[i]==1)printf("+x");else if(nb[i]==-1)printf("-x");else if(nb[i]>0)printf("+%dx",nb[i]);elseprintf("%dx",nb[i]);}else if(nb[i]==1)printf("+x^%d",i-100);else if(nb[i]==-1)printf("-x^%d",i-100);else if(nb[i]>=0)printf("+%dx^%d",nb[i],i-100);elseprintf("%dx^%d",nb[i],i-100);}}if(flag==0)printf("0");printf("\n");}return 0;}运行结果:。