一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include <stdio.h>
#include <stdlib.h>
typedef struct Node    //定义单链表结构存储多项式 
{
	int xishu;
	int zhishu;
	struct Node *next; 
}Node,*List;
List input(List L,int num);     //读取数据 
List multi(List L1,List L2);    //两个多项式相乘 
List add(List L1,List L2);      //两个多项式相加 
void print(List L);            //输出多项式 
int main()
{
	int num1,num2;             //两个多项式的项数      
	List L1,L2,L;             //L1为第一个输入的多项式,L2为第二个输入的多项式,L为相加或相乘的结果 
	scanf("%d",&num1);
	L1=input(L1,num1);
	scanf("%d",&num2);
	L2=input(L2,num2);
	L=multi(L1,L2);
	print(L);
	printf("\n");
	L=add(L1,L2);
	print(L);
	return 0;
}

List input(List L,int num)
{
	int i;
	Node*p,*s;
	L=(Node*)malloc(sizeof(Node));       //建立头结点 
	L->next=NULL;
	p=L;
	for (i=0;i<num;i++)            //读入数据 
	{
		s=(Node*)malloc(sizeof(Node));
		scanf("%d%d",&s->xishu,&s->zhishu);
		p->next=s;
		p=s;
	}
	p->next=NULL;
	return L;	
}

List add(List L1,List L2)
{
	List L;
	Node*p,*s,*r,*Lp;
	p=L1->next;
	s=L2->next;
	L=(Node*)malloc(sizeof(Node));     //建立头结点 
	L->next=NULL;
	r=L;
	while (p && s)
	{
		Lp=(Node*)malloc(sizeof(Node));
		if (p->zhishu>s->zhishu)    
		{
			Lp->zhishu=p->zhishu;
			Lp->xishu=p->xishu;
			p=p->next;
		}else if (p->zhishu<s->zhishu)
		{
			Lp->zhishu=s->zhishu;
			Lp->xishu=s->xishu;
			s=s->next;
		}else
		{
			Lp->zhishu=p->zhishu;
			Lp->xishu=p->xishu+s->xishu;
			p=p->next;
			s=s->next;
			if (Lp->xishu==0) continue;       //如果系数相加等于0,则舍弃该项 
		}
		r->next=Lp;
		r=Lp;
	}
	r->next=p?p:s;
	return L;
}

List multi(List L1,List L2)
{
	List L,Lsum;
	Node*p,*s,*r,*Lp;
	p=L1->next;
	s=L2->next;
	Lsum=(Node*)malloc(sizeof(Node));           //建立头结点 
	Lsum->next=NULL;
	while (p)
	{
		L=(Node*)malloc(sizeof(Node));
		L->next=NULL;
		r=L;
		while(s)                             //依次乘以第二个多项式的每一项 
		{
			Lp=(Node*)malloc(sizeof(Node));
			Lp->xishu=(p->xishu)*(s->xishu);
			Lp->zhishu=(p->zhishu)+(s->zhishu);
			s=s->next;
			r->next=Lp;
			r=Lp;
		}
		r->next=NULL;
		Lsum=add(Lsum,L);              //将每次相乘得出的多项式累加 
		free(L);
		s=L2->next;                   //又从第二个多项式的头开始依次相称 
		p=p->next;	                  //以第一个多项式的下一项为相乘因子 
	}
	return Lsum;
}

void print(List L)
{
	Node*p;
	p=L->next;
	if (!p)                        //如果为零多项式,则打印 0 0 
	{printf("0 0");return;}
	printf("%d %d",p->xishu,p->zhishu);
	p=p->next;
	while (p)
	{
		printf(" %d %d",p->xishu,p->zhishu);
		p=p->next;
	}
}

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值