高分求助C++代码解释
发布网友
发布时间:2023-12-23 14:00
我来回答
共2个回答
热心网友
时间:2024-03-24 20:28
先说原理
两个一元多项式:A:a1x^n+a2x^(n-1)+...+anx+a(n+1)(a1,a2等等后面的数字表示下标,x^n表示x的n次幂。下同)
B:b1x^m+b2x^(m-1)+...+bmx+b(m+1)
它们相加,你只需要将指数相同的2项的系数相加,指数不变。比如3x^3+5x^3,它们的指数相同,根据刚刚说的系数相加指数不变结果就是(3+5)x^3也就是8x^3。还有就是如果相加后的结果是0,就不再输出这一项。减法和加法道理一样。同时相加后所得的结果的最高次幂和相加前2个结果的最高次幂相同(也有可能是少1,因为最高次幂经过运算系数变0了)
相乘的做法是把2个多项式都遍历一遍,然后把系数相乘,指数相加。比如(x+1)*(x^2+2x)
首先遍历第一个多项式,得到第一项X,然后x和第2个多项式的每个元素都系数相乘,指数相加,这样得到的结果是x^3+2x^2
第一个多项式的第二项是1,1也和第2个多项式的每个元素都系数相乘,指数相加,这样得到的结果是x^2+2x
最后的结果就是把得到的这2个多项式相加就可以了。如果项数很多的话就是比这麻烦而已,道理一样。
好了,如果上面说的这些你都明白了,代码就很好理解了。
一开始是定义一些链表的数据结构什么的,用链表来存多项式,每个结点表示一项,有2个参数coef和exp分别表示该项的系数和幂。
之后的代码比较简单,都是定义一些操作,来说一下项的系数大于0的5种情况。
1.如果幂等于0,就直接输出系数(就是对应的常数项的情况)
2.如果系数和指数都为1,就输出x(而不是输出1x^1)
3.如果系数为1而指数不为1,就输出x^n,n代表指数
4.如果指数为1而系数不为1,就输出nx,n代表系数
5.否则就正常输出。
加法,先判断一下谁的最高次幂高,然后按照我上面说的那些方法做就可以
乘法,while(p1!=NULL)
{
pd=new LNode;
pd->next=NULL;
p=new LNode;
p->next=NULL;
t=p;
while(p2)
{
newp=new LNode;
newp->next=NULL;
newp->data.coef=p1->data.coef*p2->data.coef;
newp->data.exp=p1->data.exp+p2->data.exp;
t->next=newp;
t=t->next;
p2=p2->next;
}
PolyAdd(pd,pc,p);
CopyLink(pc,pd);
p1=p1->next;
p2=pb->next;
如果第一个多项式的首项不为空,就依次对第2个多项式进行遍历,每项都和第一个多项式的首项做指数相加,系数相乘的运算。然后第一个多项式的首项后移。用p表示本次遍历之后得到的结果。pc表示之前的遍历得到的结果和,然后把p和pc相加
我觉得代码的注释挺详细的,希望你能看懂,不懂再给我发消息吧
热心网友
时间:2024-03-24 20:28
这只是几个函数 缺少点东西 至少没有主函数这个Link
应该是 typedef *Link 然后用Link 来定义 指针变量
/*将两个一元多项式相加*/
void PolyAdd(Link &pc,Link pa,Link pb)
{
Link p1,p2,p,pd;
CopyLink(p1,pa);
CopyLink(p2,pb);
pc=new LNode;
pc->next=NULL;
p=pc;
p1=p1->next;
p2=p2->next;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data.exp<p2->data.exp)
{
p->next=p1;
p=p->next;
p1=p1->next;
}
else if(p1->data.exp>p2->data.exp)
{
p->next=p2;
p=p->next;
p2=p2->next;
}
else
{
p1->data.coef=p1->data.coef+p2->data.coef;
if(p1->data.coef!=0)
{
p->next=p1;
p=p->next;
p1=p1->next;
p2=p2->next;
}
else
{
pd=p1;
p1=p1->next;
p2=p2->next;
delete pd;
}
}
}
if(p1!=NULL)
{
p->next=p1;
}
if(p2!=NULL)
{
p->next=p2;
}
}
/*将两个多项式相减*/
void PolySubstract(Link &pc,Link pa,Link pb)
{
Link p,pt;
CopyLink(pt,pb);
p=pt;
while(p!=NULL)
{
(p->data).coef=(-(p->data).coef);
p=p->next;
}
PolyAdd(pc,pa,pt);
DestroyLink(pt);
}
//清屏函数
void Clear()
{
system("pause");
system("cls");
}
/*将两个一元多项式相乘*/
void PolyMultiply(Link &pc,Link pa,Link pb)
{
Link p1,p2,p,pd,newp,t;
pc=new LNode;
pc->next=NULL;
p1=pa->next;
p2=pb->next;
while(p1!=NULL)
{
pd=new LNode;
pd->next=NULL;
p=new LNode;
p->next=NULL;
t=p;
while(p2)
{
newp=new LNode;
newp->next=NULL;
newp->data.coef=p1->data.coef*p2->data.coef;
newp->data.exp=p1->data.exp+p2->data.exp;
t->next=newp;
t=t->next;
p2=p2->next;
}
PolyAdd(pd,pc,p);
CopyLink(pc,pd);
p1=p1->next;
p2=pb->next;
DestroyLink(p);
DestroyLink(pd);
}
}