1006——多项式乘法

多项式乘法

时间限制(普通/Java)  :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 372            测试通过 : 175 

题目描述

线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者的乘积。



输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序。每一组结束行输入为0 -1

输出

三组数据,前两组为一元整系数多项式,最后一组为两个多项式的乘积。

一元整系数多项式输出形式如下:

1)多项式项4x输出为4X

2)多项式项4x2输出为4X^2

3)第一项系数为正数时,加号不要输出

4)除常系数项外,项系数为1不显式输出,-1输出为-

例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1

样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
6X^24+12X^22-16X^18-50X^16+12X^12+76X^10+8X^8-36X^4-12X^2

提示

该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。

题目来源

CHENZ


我的答案(C++)

要用到上一题中的多项式加法

#include<iostream>
using namespace std;
struct Node
{
	int c;
	int e;
	Node *next;
};
Node* Create()
{
	Node *head,*p,*p1;
	int a,b;
	head=new Node;
	head->c=0;head->e=0;
	head->next=NULL;
	p1=head;
	cin>>a>>b;

	while(!(a==0&&b==-1))
	{
		p=new Node;
		p->c=a;p->e=b;
		p->next=NULL;
		p1->next=p;
		p1=p;
		cin>>a>>b;
	}	

	return head;
}
Node* CreateEmptyList()
{
	Node *h;
	h=new Node;
	h->c=0;
	h->e=0;
	h->next=new Node;
	h->next->c=0;
	h->next->e=0;
	h->next->next=NULL;
	return h;
}

void Print(Node *h)
{
	Node *p;
	int flag=0;// 判断一个多项式的系数是否全为0,flag=1表示不全为0
	// 多项式项数为0,输出0,返回
	if(h->next==NULL)
	{		
		cout<<0<<endl;
		return;
	}
	// 多项式项数大于0
	p=h->next;
	while(p!=NULL)
	{
		// 输出系数,系数不为0才输出	
		if(p->c!=0)
		{
			flag=1;
			// 如果是第一项的系数为正,不要输出+号
			if(p->c>0&&h->next!=p)
			{
				cout<<"+";
			}
			if(p->e==0)
			{
				cout<<p->c;
			}
			else
			{
				// 系数不为1或-1,原样输出
				if(p->c!=1&&p->c!=-1)
				{
					cout<<p->c;
				}
				else if(p->c==-1)// 系数为-1,只输出-号
					cout<<"-";
				cout<<"X";
				// 指数e不为1才输出
				if(p->e!=1)
					cout<<"^"<<p->e;
			}
		}		
		// 指向下一项
		p=p->next;
	}
	// 如果系数全为0,输出一个0
	if(flag==0)
		cout<<0;
	cout<<endl;
}

Node* PolyAdd(Node *h1,Node *h2)
{
	Node *p1,*p2,*node;
	if(h1->next==NULL)
	{
		return h2;
	}
	if(h2->next==NULL)
	{
		return h1;
	}
	p1=h1;
	p2=h2->next;


	while(p2!=NULL)
	{
		// 如果p1到最后一项了,则将p2剩余项拼接到p1后面
		if(p1->next==NULL)
		{
			p1->next=p2;
			break;
		}
		// 如果指数相等,则系数相加
		if(p1->next->e==p2->e)
		{
			p1->next->c+=p2->c;
			p1=p1->next;
			p2=p2->next;
			continue;
		}
		// 如果指数不相等,则将p2的项数插入p1
		if((p2->e) > (p1->next->e))
		{
			node=new Node;
			node->c=p2->c;
			node->e=p2->e;
			node->next=p1->next;
			p1->next=node;
			p2=p2->next;
		}
		p1=p1->next;
	}
	return h1;
}
/*
	函数功能:多项式乘法
	函数思想:创建两个空链表r1和node。
			node除了表头节点外只有一个节点,用来保存h2的某一项和h1的某一项的乘积。
			r1用来保存最终的乘积,初始为空。
			利用循环,依次将h2的每一项与h1的每一项去相乘,
			项与项之间的乘积临时保存在node中,并将node和r1相加,
			等循环结束,r1中保存的就是最后的乘积。
*/
Node* PolyMul(Node *h1,Node *h2)
{
	Node *p1,*p2;
	Node *r1;// 保存最终结果的链表
	Node *node;// 保存临时结果
	p1=h1->next;
	p2=h2->next;

	r1=CreateEmptyList();
	node=CreateEmptyList();
	while(p2!=NULL)
	{
		
		while(p1!=NULL)
		{
			node->next->c=p1->c*p2->c;
			node->next->e=p1->e+p2->e;
			node->next->next=NULL;

			r1=PolyAdd(r1,node);
			p1=p1->next;
		}
		p2=p2->next;
		p1=h1->next;
	}
	return r1;
}
int main()
{
	Node *product;
	Node *h1=Create();
	Node *h2=Create();
	Print(h1);
	Print(h2);
	product=PolyMul(h1,h2);
	Print(product);
	return 0;	
}



 转载请指明出处: 
   http://blog.csdn.net/fxdaniel/article/details/43448523 
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值