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"。最后就采用了最直接的方法:利用链表,解决问题。
其实这个题做出来之后想想还真不算是难题,之前想复杂了。《数据结构与算法分析——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; }
相关文章推荐
- POJ 多项式加法
- poj 多项式加法 map
- POJ 多项式加法
- POJ-数据结构与算法-线性表 多项式加法
- poj 1625 AC自动机+动归+大数加法
- POJ——多项式加法(WA)
- Poj 2981:大整数加法
- POJ1753 Flip Game(AC)
- 5-1 一元多项式的乘法与加法运算 (20分)
- POJ 2778 AC自己主动机+矩阵幂 不错的题
- PAT 一元多项式的乘法与加法运算(20)(模拟计算过程)
- 7-2 一元多项式的乘法与加法运算(20 分)
- PAT 02-线性结构2 一元多项式的乘法与加法运算 (java)
- poj2527——Polynomial Remains(多项式相除)
- 【POJ 4052】Hrinity(AC自动机)
- Java数据结构之多项式加法和乘法实现
- 多项式加法运算
- 数据结构的应用——一元N次多项式的加法
- POJ 2527 Polynomial Remains 多项式运算
- POJ 2981 大整数加法 解题报告