zkkpkk 发表于 2007-7-4 11:09:34

本学期最后一个技术贴,多项式加、乘法

/*
[全民编程]76道C++高难度自虐题之43:对于次数很高,但项目很少的多项式,可用链表来表示。
例如:X^1000-76*X^76+3*X^3-7可表示为
┌─┬──┬─┐┌──┬─┬─┐   ┌─┬─┬─┐┌─┬─┬──┐
│1 │1000│┼→│-76 │78│┼→ │3 │3 │┼→│-7│0 │ NIL│
└─┴──┴─┘└──┴─┴─┘   └─┴─┴─┘└─┴─┴──┘
在此方式下,编程完成两个多项式的加法与乘法。
*/
#include <iostream.h>
class Node
{
private:
int cof;
int exp;
Node* next;
public:
//用默认值初始化
Node()
{
cof=0;
exp=0;
next=NULL;
}
//用给定值初始化
Node(int cof,int exp)
{
this->cof=cof;
this->exp=exp;
next=NULL;
}
//建立多项式
Node* CreateLink(Node* head,int m);
//取头节点
Node* GetHead(Node* head);
//多项式加法
Node* AddNode(Node* head1,Node* head2);
//乘法
Node* MultiNode(Node* head1,Node* head2,Node* head3);
//输出
void Display(Node* head);
};
/*取头节点*/
Node* Node::GetHead(Node* head)
{
return head;
}
/*输出多项式*/
void Node::Display(Node* head)
{
Node* temp=head;
while(temp!=NULL)
{
temp=temp->next;
if(temp->exp==0)//处理指数为0的情况
   cout<<temp->cof<<"";
else
   cout<<temp->cof<<"*X^"<<temp->exp<<"";
}
cout<<endl;
}
/*建立链表,m为节点数*/
Node* Node::CreateLink(Node* head,int m)
{
Node *p=head;
cout<<"Input cof and exp"<<endl;
for(int i=1;i<=m;i++)
{
int cof,exp;
cout<<"cof:";
cin>>cof;
cout<<"exp";
cin>>exp;
Node* newnode=new Node;
newnode->cof=cof;
newnode->exp=exp;
newnode->next=p->next;
p->next=newnode;
p=newnode;
}
return head;
}
/*多项式加法*/
Node* Node::AddNode(Node* head1,Node* head2)
{
Node* ha=GetHead(head1);
Node* hb=GetHead(head2);
Node *la=ha,*lb=hb;
Node *qa=la->next;
Node *qb=lb->next;
while(qa!=NULL && qb!=NULL)//pa,pb不为空指数比较
{
if(qa->exp > qb->exp)//如果qa指数大
{
   la=qa;
   qa=qa->next;
}
if(qa->exp == qb->exp)//如果指数相等
{
   int sum=qa->cof+qb->cof;
   if(sum!=0)//系数不为0
   {
    /*修改系数值*/
    qa->cof=sum;
    la=qa;
    qa=qa->next;
    lb->next=qb->next;
    delete qb;
    qb=lb->next;
   }
   else//系数为0
   {
    /*删除多项式pa中的当前节点*/
    la->next=qa->next;
    delete qa;
    qa=la->next;
    lb->next=qb->next;
    delete qb;
    qb=lb->next;
   }
}
if(qa->exp < qb->exp)//如果pb指数大
{
   /*qb在前*/
   lb->next=qb->next;
   la->next=qb;
   qb->next=qa;
   la=qb;
   qb=lb->next;
}
}
if(qb!=NULL)
la->next=qb;
delete lb;
return ha;
}
/*乘法*/
Node* Node::MultiNode(Node* head1,Node* head2,Node* head3)
{
Node* ha=GetHead(head1);
Node* hb=GetHead(head2);
Node* hc=GetHead(head3);
Node *la=ha,*lb=hb,*tmp=hc;
Node* qa=la->next;
Node* qb=lb->next;

while(qa!=NULL)
{
while(qb!=NULL)
{
   /*系数相乘指数相加*/
   int sumc=qa->cof*qb->cof;
   int sume=qa->exp+qb->exp;
   /*结果存入新的节点*/
   Node* newnode=new Node;
   newnode->cof=sumc;
   newnode->exp=sume;
   newnode->next=tmp->next;
   tmp->next=newnode;
   tmp=newnode;
   qb=qb->next;
}
/*qb回到第一个qa指向下一个*/
qb=lb->next;
qa=qa->next;
}
delete tmp;
return hc;
}
int main()
{
Node* head1=new Node;
Node* head2=new Node;
Node* head3=new Node;
Node n1;
n1.CreateLink(head1,2);
cout<<"Ploy1:";
n1.Display(head1);
n1.CreateLink(head2,2);
cout<<"Ploy2:";
n1.AddNode(head1,head2);
cout<<"Ploy1 add ploy2:";
n1.Display(head1);
n1.MultiNode(head1,head2,head3);
cout<<"Ploy1 mut ploy2:";
n1.Display(head3);
return 0;
}现在我累计了7道了,外国朋友Hjin(后来得知不是中国的至于哪国他也没说),势如破竹累计了17道,现在他还在做,差距还在拉大,更可怕的是压轴的第76题他已经KO了,胜负已分了:funk ,所以现在比赛已经演变为了Hjin的程序设计艺术展了:titter,我放假后个把星期不能上,可能会被追上

[ 本帖最后由 zkkpkk 于 2007-7-4 19:20 编辑 ]

zkkpkk 发表于 2007-7-5 23:28:33

沙发,都不喜欢算法......
页: [1]
查看完整版本: 本学期最后一个技术贴,多项式加、乘法