G. DS线性表—多项式相加

这题最大的问题在于多项式的“ + ”输出,我在网上看到有些答案不全面,但是OJ上一样AC。自己做了一个较全面的方法。

举一个例子,如果多项式有非空的10项,但是前5项系数不为0,后5项系数全为0,那么输出第五项后就不能再输出“ + ”。我们可以用sum=0来记录后面系数是否全都为0.

总结:后面的非空项如果系数有不为0的,就要输出“ + ”,如果全为0,则不能输出“ + ”。

void print(Node *p){
			p=p->next;
			while(p){
				if(p->data){     //系数不为0
					if(p->ver==0){    //指数为0
						if(p->data<0)    //系数小于0
							cout<<"("<<p->data<<")";
						else    //系数大于0
							cout<<p->data;
					}
					else if(p->ver<0){   //指数小于0
						if(p->data<0)  
						cout<<"("<<p->data<<")x^"<<"("<<p->ver<<")";
						else if(p->data>0)
						cout<<p->data<<"x^"<<"("<<p->ver<<")";
					}
					else{     //指数大于0
						if(p->data<0)
						cout<<"("<<p->data<<")x^"<<p->ver;
						else if(p->data>0)
						cout<<p->data<<"x^"<<p->ver;
					}   
					int sum=0;   //以下是关键代码块。sum记录后面的系数是否全为0
					Node *d=p->next;
					while(d){
						if(d->data)
						sum++;   //如果有系数不为0,sum++;
						d=d->next;
					}
					if(sum)   //如果后面有系数不为0,则输出“ + "
					cout<<" + ";
				}
				p=p->next;
			}
				cout<<endl;
		}

 AC代码如下

#include<iostream>
using namespace std;
class Node{
	public:
		int data;
		int ver;
		Node *next=NULL;
};
class List{
	int n,m;
	Node *head1,*head2,*head3;
	public:
		List(){
			head1=new Node;
			head2=new Node;
			head3=new Node;
		}
		void createlist(){
			cin>>n;
			Node *p1=head1,*s1,*p2=head2,*s2;
			for(int i=0;i<n;i++){
				s1=new Node;
				cin>>s1->data>>s1->ver;
				p1->next=s1;
				p1=s1;
			}
			print(head1);
			cin>>m;
			for(int i=0;i<m;i++){
				s2=new Node;
				cin>>s2->data>>s2->ver;
				p2->next=s2;
				p2=s2;
			}
			print(head2);
		}
		void addlist(){
			Node *p1=head1->next,*p2=head2->next,*p3=head3,*s3;
			while(p1&&p2){
				s3=new Node;
				if(p1->ver==p2->ver){
					s3->ver=p1->ver;
					s3->data=p1->data+p2->data;
					p3->next=s3;
					p3=s3;
					p1=p1->next;
					p2=p2->next;
				}
				else if(p1->ver<p2->ver){
					s3->ver=p1->ver;
					s3->data=p1->data;
					p3->next=s3;
					p3=s3;
					p1=p1->next;
				}
				else{
					s3->ver=p2->ver;
					s3->data=p2->data;
					p3->next=s3;
					p3=s3;
					p2=p2->next;
				}
			}
			while(p1){
				s3=new Node;
				s3->ver=p1->ver;
				s3->data=p1->data;
				p3->next=s3;
				p3=s3;
				p1=p1->next;
			}
			while(p2){
				s3=new Node;
				s3->ver=p2->ver;
				s3->data=p2->data;
				p3->next=s3;
				p3=s3;
				p2=p2->next;
			}
			print(head3);
		}
		void print(Node *p){
			p=p->next;
			while(p){
				if(p->data){
					if(p->ver==0){
						if(p->data<0)
							cout<<"("<<p->data<<")";
						else
							cout<<p->data;
					}
					else if(p->ver<0){
						if(p->data<0)
						cout<<"("<<p->data<<")x^"<<"("<<p->ver<<")";
						else if(p->data>0)
						cout<<p->data<<"x^"<<"("<<p->ver<<")";
					}
					else{
						if(p->data<0)
						cout<<"("<<p->data<<")x^"<<p->ver;
						else if(p->data>0)
						cout<<p->data<<"x^"<<p->ver;
					}
					int sum=0;
					Node *d=p->next;
					while(d){
						if(d->data)
						sum++;
						d=d->next;
					}
					if(sum)
					cout<<" + ";
				}
				p=p->next;
			}
				cout<<endl;
		}
};
int main(){
	int t;
	cin>>t;
	while(t--){
	    List list;
		list.createlist();
		list.addlist();
	}
	cout<<endl;
	return 0;
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值