POJ——多项式加法(AC)

在失败了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;
}





  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值