多项式乘法

题目的链接为:[url]http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1006[/url]
题目为:
多项式乘法
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:171 测试通过:77

描述


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

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


输入


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

刚做完多项式加法,趁热打铁做多项式乘法。其实乘法就是遍历两个多项式,将系数相乘,指数相加:
如果有指数相同的项,那么合并;
如果没有指数相同的项,那么按照指数递减的顺序找到合适的位置存放该项目。
最后再输出。

#include<iostream>
using namespace std;
typedef struct node{

int xs;
int zs;
struct node *next;
}Node;
int xs,zs;
bool tag=true;
void print(Node *root)
{
Node *p=root->next;
while(p!=NULL)
{
if(p->xs==0)
{
p=p->next;
continue;
}
if(p==root->next)
{
if(p->xs!=1)
{
if(p->xs==-1)
{
cout<<"-";
}
else
{
cout<<p->xs;
}
}
}
else
{
if(p->xs>0)
{
cout<<"+";
if(p->xs!=1)
{
cout<<p->xs;
}
}
else
{
if(p->xs!=-1)
{
cout<<p->xs;
}
else
{
cout<<"-";
}
}
}
if(p->zs!=0)
{
cout<<"X";
}
else
{
if(p->xs==1||p->xs==-1)
{
cout<<"1";
}

p=p->next;
continue;
}
if(p->zs!=1)
{
cout<<"^"<<p->zs;
}

p=p->next;
}
cout<<endl;
}
int main(){

Node *root[2],*root1,*t,*u,*k,*e1,*e2;
for(int i=0;i<2;i++){
root[i]=NULL;
}
root1=new Node();
for(int i=0;i<2;i++){
while(cin>>xs>>zs&&(xs!=0||zs!=-1)){

if(xs==0)
{
continue;
}
if(root[i]==NULL)
{
Node *temp=new Node();
temp->xs=xs;
temp->zs=zs;
temp->next=NULL;

root[i]=new Node();
root[i]->next=temp;
}
else
{
Node *p,*q;
p=root[i]->next;
q=root[i];
while(p!=NULL&&p->zs!=zs)
{
q=p;
p=p->next;
}
if(p==NULL)
{
Node *temp=new Node();
temp->xs=xs;
temp->zs=zs;
temp->next=NULL;

q->next=temp;
}
else
{
p->xs+=xs;
if(p->xs==0)
{
q->next=p->next;
}
}
}
}
print(root[i]);
}
t=root[0]->next;
u=root[1]->next;
k=root1;

while(t!=NULL)
{
u=root[1]->next;
while(u!=NULL)
{
int tempXS=t->xs*u->xs;
int tempZS=t->zs+u->zs;
if(tempXS==0)
{
u=u->next;
continue;
}
else
{
e2=root1->next;
e1=root1;
while(e2!=NULL&&e2->zs!=tempZS)
{
e1=e2;
e2=e2->next;
}
if(e2==NULL)
{
Node *tempNode=new Node();
tempNode->xs=tempXS;
tempNode->zs=tempZS;
tempNode->next=NULL;

//按照指数的大小放到合适的位置
e2=root1->next;
e1=root1;
while(e2!=NULL&&e2->zs>tempNode->zs)
{
e1=e2;
e2=e2->next;
}
e1->next=tempNode;
tempNode->next=e2;
}
else
{
e2->xs+=tempXS;
}
}
u=u->next;
}
t=t->next;
}
print(root1);

//释放new的空间
for(int i=0;i<2;i++)
{
t=root[i];
u=t;
while(t!=NULL)
{
u=t->next;
delete t;
t=u;
}
}
t=root1;
u=t;
while(t!=NULL)
{
u=t->next;
delete t;
t=u;
}
system("pause");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值