您的位置:首页 > 其它

POJ——多项式加法(AC)

2013-11-11 21:54 323 查看
在失败了50次之后,终于在光棍节这一天AC了!因为这还错过了联谊会,想想还真是diao丝啊




其实这个题做出来之后想想还真不算是难题,之前想复杂了。《数据结构与算法分析——C语言描述》3.2 节"The List ADT" 就是以多项式加法为例子讲解的List的应用。

我最开始写的答案思路是:将每一组的两个多项式的系数和幂数,分别保存到两个结构体数组_array1和_array2中,一组输入完后利用quick sort对_array2 ,_array2分别按照幂数从大到小排序。排序之后根据归并排序的思路来计算多项式的和,将结果保存到二维数组中。当输入结束再输出结果。不过那个程序里有个错误是对题目中的条件“为了标记每行多项式的结束,在表达式后面加上了一个幂数为负数的整数对"理解有误,我以为负幂数一定是在每一行的最后,但实际上负幂数可以出现在每一行的任何位置,负幂数之后的数据不可以参与计算。将这一点修改之后程序就可以正确运行了,但是提交之后会提示“Time
Lmit Exceeded",就是当输入数据较大时程序执行时间太长,说明我的这个算法还是有很大缺陷的。

后来减小运行时间,采用了《数据结构与算法分析》里的第一个利用数组的思路,确实很快,但是需要占用很大内存,提交后会提示“Runtime Error"。最后就采用了最直接的方法:利用链表,解决问题。

#include <iostream>

using namespace std;

class Node{
public:
Node *next_;
int coeff_;
int power_;
};

class List{
public:
List(void)	{ head_=new Node;  head_->next_=NULL;  }
~List(void) { delete head_; }
void Insert(int coeff ,int power){
Node *pnode = head_;
while( pnode->next_ != NULL && pnode->next_->power_ > power ){
pnode = pnode->next_;
}
if ( pnode->next_!=NULL && pnode->next_->power_ == power ){
pnode->next_->coeff_ += coeff;
}else{
Node *nnode = new Node;
nnode->coeff_ = coeff;
nnode->power_ = power;
nnode->next_ = pnode->next_;
pnode->next_ = nnode;
}
}
void Output(void) {
Node *pnode = head_->next_;
while( pnode != NULL ){
if ( pnode->coeff_ != 0 )
cout << "[ " << pnode->coeff_ << " " << pnode->power_ << " ] " ;
pnode = pnode->next_;
}
cout << endl;
}
private:
Node *head_;
};

List *_list;

int main(void){
int i,j;
int num, coeff, power;
string s;
cin >> num;
_list = new List [num];
for ( i=0; i<num; i++ ){
cin >> coeff >> power;
while( power >= 0 ){
_list[i].Insert(coeff,power);
cin >> coeff >> power;
}
getline(std::cin, s);

cin >> coeff >> power;
while( power >= 0 ){
_list[i].Insert(coeff,power);
cin >> coeff >> power;
}
getline(std::cin, s);
}
for ( i=0; i<num; i++ )
_list[i].Output();
delete[] _list;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: