高分求助C++代码解释

这是C++一元多项式的加减乘 运算程序,可否帮我解释下各个模块的作用,及
相应的加减乘的操作原理
代码有点长,看hi,baidu里的代码吧,好答案加分。
http://hi.baidu.com/fox4four/blog/item/d1c1fca64eab089dd04358ec.html

先说原理
两个一元多项式: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相加

我觉得代码的注释挺详细的,希望你能看懂,不懂再给我发消息吧
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-20
这只是几个函数 缺少点东西 至少没有主函数这个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);
}
}

高分求助C++代码解释
两个一元多项式: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,它们的指数相同,根据刚刚说的系数相加指数不变结果就...

c++编程求助~计算最高分最低分和平均分
const int N=10;void main(){ float student[N];int i,add=0;float max,min,average;for(i=0;i<N;i++){ printf("请输入第%d个学生的数学成绩(共10人):",i+1);scanf("%f",&student[i]);} max=min=student[0];for(i=0;i<N;i++){ if(student[i]>max)max=student[i]...

高分求助一个C++问题(急!!!)
1、vector是模板类,必须指定类型才能用,比如vector<long> 2、array是保留字,不能用作变量名,至少在vc2008下是这样的,所以我改成了my_array 3、vector::size_type,同1问题,也得给出类型vector<long>::size_type 4、 for(vector::size_type i=array.size();i>=0;--i)这句判断是有问...

C语言经典100例问题,取一个整数a从右端开始的4~7位,求助,高分!
但是我按下面的程序得到的结果好像是错的,求助,高分。程序分析:可以这样考虑: (1)先使a右移4位。 (2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4) (3)将上面二者进行&运算。 2.程序源代码: main() { unsigned a,b,c,d; scanf("%o",&a); b=a>>4; c=~... 展开 匿名 | 浏览3241...

高分求助,C编程。给文件里的每行加号码
void main(){ FILE *i,*o;char buf[MAXLENGTH+1],*temp,ch;i=fopen("c:\\\\1.txt","r");o=fopen("c:\\\\out.txt","w");int line=0;while(1) { if (NULL==fgets(buf,MAXLENGTH,i)) break;temp=buf;while (*temp==' ') temp++; \/*去除前面的空格,如果一行全是空格则也认为...

c++求助:这题应该怎么做?
for (i = 0; i < n; i++){ sum += score[i];for (j = 0; j < i; j++)if (score[i] > score[j]){ int t = score[i];score[i] = score[j];score[j] = t;} } avgscore = sum \/ n;maxscore = score[0];minscore = score[n - 1];} void main(){ int ...

高分求助关于acm的问题!
就知道“要不要再把c++给学了”。实际上,您学了c语言,进一步学习c++很容易,而且,相关技术和应用更广泛,对您扩展和提高很有帮助。高效学习方法:边学边练边实践,借助动画视频演练--结合实际训练,一定会很快学会的。世上无难事只怕有心人,有志者事竟成!祝福您万事如意,早日成才!

高分求助:推荐一本学习vc++2005的书籍
学VC++的.一般过程 都是学会C 跟 C++之后.要学 Windows程序设计 深入浅出MFC VC++技术内幕 没听说过谁,直接学 VC++ 如果直接学,那样的书要多厚? 5000页?还是一万页.如果你.Windows程序设计 深入浅出MFC VC++技术内幕 全学会了. 只是想熟悉下 VC++的集成环境的话,无论什么版本的.根本没必...

vc++读取注册表,高分求助
bool CSetDataBase::SetDBValue(void){ UpdateData(TRUE);HKEY hKey , hKeySub;\/\/定义有关的hKEY,在查询结束时要关闭 DWORD dwType=REG_SZ; \/\/定义读取数据类型 LPCTSTR RegValueNameDB = "DBAdress";LPCTSTR RegValueNameUser = "User";LPCTSTR RegValueNamePWD = "Pwd";char content[...

~~~求助0x01281c37指令引用的0x001ffffc内存
c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查这种错误,认为地址分配已经成功,于是就访问0X00000000的地址,于是就发生内存违规访问,同时该进程被终止。ASCII字符填充组成的pif文件时会出现以下情况:一个非法的pif文件(用ascii字符\\''x\\...

相似回答
大家正在搜