多项式求和

一般情况下,一元n次多项式可写成:


其中,pi是指数为ei的项的非零系数,且满足


因此,我们可以采用线性表(定义:线性表是由n个数据元素构成的有限序列,比如数组、向量、链表等等)来表示:


其中,每一项的指数i可以用其系数pi的序号表示。

       在通常的应用中,多项式的次数比较大,使得线性表的长度很难确定,因此我们可以考虑链表,向量也可以(c++中)。举例说明:假如我们用数组来表示下面的多项式:


       可见,我们需要一个大小为1549的数组来表示,而实际有用的信息只有数组中的4个元素,其他地方都是0,所以造成了空间浪费。并且如果我们事先不知道多项式的最高次项的指数,则我们需要定义一个足够大的数组来存储,这样做显然浪费了很多内存空间。我们可以使用链表来解决上述问题:

       在计算机内,我们用一个结点来存放多项式的一项,为了节约空间,并和书写习惯一致,只需保留非零系数的项。每个结点分系数、指数和指针三个域,如下图所示,其中的指针next指明下一项的位置。


例如,下面多项式分别为A,B:

        

用循环链表可以表示如下:


       两个多项式相加的运算规则很简单,对所有指数相同的项,将其对应系数相加,若和不为零,则构成和多项式中的一项;将所有指数不相同的项复制到和多项式中。具体实现时,我们以上面的多项式A,B为测试样例。可采用另建链表来存储和的多项式的方法,或采用把一个多项式归并入另一个多项式的方法。我们以后种方法为例,即将A+B的和多项式存储到A中。具体程序实现如下(我采用了循环链表):

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<conio.h>  
  4.   
  5. typedef struct pnode//用链表来存储多项式信息  
  6. {  
  7.     float coef;//多项式系数  
  8.     int   exp;//多项式指数  
  9.     struct pnode *next;  
  10. }polynode;  
  11.   
  12. polynode *Create()  
  13. {  
  14.     float coef;  
  15.     int exp;  
  16.     polynode *head,*s,*r;  
  17.     head=(polynode*)malloc(sizeof(polynode));  
  18.     head->coef=0;  
  19.     head->exp=-1;  
  20.     r=head;  
  21.     printf("请输入各项的系数和指数:\n");  
  22.     while(1)  
  23.     {  
  24.         scanf("%f %d",&coef,&exp);  
  25.         if(coef!=0)//输入0 0来结束输入  
  26.         {  
  27.             s=(polynode*)malloc(sizeof(polynode));  
  28.             s->coef=coef;//s用来保存当前节点  
  29.             s->exp=exp;  
  30.             r->next=s;  
  31.             r=s;  
  32.         }  
  33.         else  
  34.             break;  
  35.     }  
  36.   
  37.     r->next=head;//构造循环链表  
  38.     return head;  
  39.   
  40. }  
  41.   
  42. polynode*PolyAdd(polynode* pa,polynode* pb)//进行多项式相加  
  43. {  
  44.     polynode *p,*q,*r,*s;  
  45.     float x;  
  46.     p=pa->next;//分别指向多项式的第一项  
  47.     q=pb->next;  
  48.     s=pa;//s用于保存当前节点  
  49.   
  50.     while((p!=pa)&&(q!=pb))//没有结束,回到链表头  
  51.     {  
  52.         if(p->exp<q->exp)//p的指数小于q的指数,将p放入链表中  
  53.         {  
  54.             s=p;  
  55.             p=p->next;  
  56.         }  
  57.         else if(p->exp>q->exp)//p的指数大于q的指数,将q放入链表中  
  58.         {  
  59.             r=q->next;  
  60.             q->next=p;  
  61.             s->next=q;  
  62.             s=q;  
  63.             q=r;  
  64.         }  
  65.         else//当两者指数相同时,进行合并  
  66.         {  
  67.             x=p->coef+q->coef;  
  68.             if(x!=0)  
  69.             {  
  70.                 p->coef=x;  
  71.                 s=p;  
  72.             }  
  73.             else//若合并结果为0,将该节点移除  
  74.             {  
  75.                 s->next=p->next;  
  76.                 free(p);  
  77.             }  
  78.                     p=s->next;  
  79.         r=q;  
  80.         q=q->next;  
  81.         free(r);  
  82.         }  
  83.   
  84.     }  
  85.   
  86.     if(q!=pb)//如果多项式b的项数少于多项式a的情况  
  87.     {  
  88.         r=q;  
  89.         while(r->next!=pb)  
  90.             r=r->next;  
  91.         s->next=q;  
  92.         r->next=pa;  
  93.     }  
  94.     return pa;  
  95. }  
  96.   
  97. void Output(polynode *head)// 输出多项式信息  
  98. {  
  99.     polynode *p;  
  100.     printf("系数和指数分别为:");  
  101.     p=head->next;  
  102.     while(p!=head)  
  103.     {  
  104.         printf("%.1f , %d    ",p->coef,p->exp);  
  105.         p=p->next;  
  106.     }  
  107.     printf("\n");  
  108. }  
  109.   
  110. void main()  
  111. {  
  112.     polynode* ha,*hb;  
  113.     printf("\n建立多项式A:");  
  114.     ha=Create();  
  115.     Output(ha);  
  116.     printf("\n建立多项式B:");  
  117.     hb=Create();  
  118.     Output(hb);  
  119.   
  120.     ha=PolyAdd(ha,hb);  
  121.     printf("\n多项式A+B:");  
  122.     Output(ha);  
  123. }  

运行结果如下:



原文:http://blog.youkuaiyun.com/tengweitw/article/details/40476935

作者:nineheadedbird

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值