多项式相乘(conv.cpp)

多项式相乘:conv.cpp

【问题描述】

编程实现若干个多项式相乘。多项式的输入输出格式为:系数在前,指数在后,各项按指数递增排列,每个多项式输入时以两个0结束。系数为0的项不输出。例如:1+4X3-9X5

输入格式可以为:1 0 0 1 0 2 4 3 0 4 -9 5 0 0或者 1 0 4 3 -9 5 0 0

输出只能是:1 0 4 3 -9 5

【输入】

输入文件conv.in包含n+1行:第1行为一个正整数n,表示多项式的个数。第2n+1行,每行为一个多项式,多项式输入时以两个0结束。例如:

1 0 1 1 0 0

1 0 -1 1 0 0

1 0 1 2 0 0

表示:(1+x)(1-x)(1+x2)

【输出】

输出文件conv.out包含1行,为上述多项式相乘结果。上例的输出为:

1 0 -1 4

表示1-x4

【输入输出样例1

conv.in

conv.out

3

1 0 1 1 0 0

1 0 -1 1 0 0

1 0 1 2 0 0

1 0 -1 4

【数据限制】

所有系数、指数均为整数(int类型)。

多项式的个数n满足:2≤n≤20

/*实现n个多项式相乘*/
#include "stdio.h"
const int N0=20;	//常数: 多项式最多20个

typedef struct node{	//多项式的项(链表节点), 数据包含: 项的系数和指数, 下一项的指针.
	int c, e;			//c-系数(coefficient); e-指数(exponent)
	struct node *next;	//下一个多项式项的指针
}NP;

NP *createPoly(){	//创建一个多项式(对应一个多项式链表)
	int c, e;		//c-系数(coefficient); e-指数(exponent)
	NP *head, *p;	//head-多项式头指针; p-游标指针
	head=p=new NP;	//初始化多项式的 头指针 & 游标指针
	while( true ){
		/*(1)输入(获得)多项式'项'的数据[系数+指数]信息 */
		scanf("%d%d", &c, &e);	//输入多项式项 ==> 根据输入数据的特点: 系数+指数 紧接着出现!
		if( c==0 && e==0 ){	//根据约定, 系数 & 指数 都为0, 则多项式输入结束
			break;
		}else if(c==0){ //此多项式'项'的系数=0, 可以不需要次多项式'项'!
			continue;
		}
		
		/*(2)多项式数据项有效, 则创建 多项式'项'(对应于链表节点)*/
		p->next=new NP;
		p=p->next;
		
		/*(3)维护多项式项的数据信息*/
		p->c=c;
		p->e=e;
	}
	p->next=NULL; //多项式最后一个节点的 "下一个多项式项 指针"为空 ==> 标志为多项式(链表)末尾
	
	return head;  //返回多项式链表的头指针
}

void printPoly( NP *head ){ //打印输出多项式链表
	NP *p=head->next; //p-遍历指针
	while( p ){
		printf("%d %d ", p->c, p->e);
		p=p->next;
	}
	printf("\n");
}

void freePoly( NP *head){ //删除参数(头指针head)指定的多项式, 回收其所占用的内存空间
	NP *p; //p-遍历指针
	while( head ){
		p=head;
		head=head->next;
		delete p;
	}
}

NP *addPoly( NP *ha, NP *hb){ //实现两个多项式相加(需要处理同类项[即指数相同的项]),返回结果多项式的链头指针.
NP *hc, *pc, *pa=ha->next, *pb=hb->next;
	hc=pc=new NP;
	int c, e;
	while( pa || pb )
	{
		if( pa && (pb==NULL  || pa->ee)  )
		{	c=pa->c;
			e=pa->e;
			pa=pa->next;
		}
		else if( pb && (pa==NULL  || pb->ee)  )
		{	c=pb->c;
			e=pb->e;
			pb=pb->next;
		}
		else 
		{	c=pa->c+pb->c;
			e=pa->e;
			pa=pa->next;
			pb=pb->next;
		}
		if( c )
		{	pc->next=new NP;
			pc=pc->next;
			pc->c=c;
			pc->e=e;
		}
	}
	pc->next=NULL;
	return hc;

}

NP *oneXmulty( NP *pa, NP *hb ){ //pa-某个多项式'项'; hb-一个多项式(多个'项'), 返回pa*ha的结果多项式:头指针
NP *hc, *pc, *pb=hb->next;
	hc=pc=new NP;	
	while( pb )
	{	
		pc->next=new NP;
		pc=pc->next;
		pc->c=pa->c*pb->c;
		pc->e=pa->e+pb->e;
		pb=pb->next;
	}
	pc->next=NULL;
	return hc;
}
NP *multyXmulty( NP *ha, NP *hb )
{	NP *hc, *ht, *pa=ha->next;
	hc=new NP;
	hc->next=NULL;
	while( pa )
	{
		ht=oneXmulty( pa, hb );
		hc=addPoly( hc, ht );
		freePoly( ht );
		pa=pa->next;
	}
	return hc;

}

int main(){
	int n, i; //n-多项式的个数; i-循环控制变量
	NP *hink[N0], *hc, *temp;	//hink[]-待相乘的若干个多项式的头指针; hc-多项式相乘结果头指针;	
	scanf("%d", &n);	//输入多项式的个数n
	
	/*(1)创建n个多项式链表*/
	for(i=0;i
多项式相乘(conv.cpp)_第1张图片

你可能感兴趣的:(C)