《程序设计实践》第06练——多项式相乘

**

《程序设计实践》第06练——多项式相乘

**
注意:打开相关源程序后,只能在//********与//=======之间编写程序,若修改其它部分可能得0分。

  1. 多项式相乘:conv.cpp(本题100分)

【问题描述】 编程实现若干个多项式相乘。多项式的输入输出格式为:系数在前,指数在后,各项按指数递增排列,每个多项式输入时以两个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,表示多项式的个数。第2到n+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;
【提示】参考程序提供了2种解法
(1) 综合应用前序程序设计实践所掌握的数组、结构体、指针、有序链表合并等知识进行编程;
(2) 每个多项式存储一个链表中,链表节点中存储有多项式某个’项’的系数c和指数e。
(3) 多项式A和B相乘时,A的每个节点(指数)乘于B的各个节点,结果为一个多项式Temp;逐一累加上述多项式Temp(期间需要合并同类项,即指数相同的节点,即可获得多项式乘积的最终结果!

在这里插入代码片
/*实现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-结果多项式的链头和遍历游标指针; pa,pb-两个相加的多项式的遍历游标指针
	int c, e; //c,e-多项式'项'的系数和指数
	hc=pc=new NP; //初始化结果多项式的链头指针hc&遍历游标指针pc
	while( pa || pb ){
		/**(1)获得次数循环的 多项式'项'的: 系数c 和 指数e*/
		if( pa && (pb==NULL || pa->e < pb->e) ){ //(1)若pa'项'存在, 并且[(pb'项'为NULL) 或 (pa'项'的指数小于 pb的指数)], 即只处理pa'项'
			//和的'多项式项' 只包括pa的当前项
			c=pa->c;
			e=pa->e;
			
			pa=pa->next; //移动游标pa至下一个
		}else if( pb && (pa==NULL || pa->e > pb->e) ){ //与(1)类似, 只处理pb'项'
			//和的'多项式项' 只包括pa的当前项
			c=pb->c;
			e=pb->e;
			
			pb=pb->next; //移动游标pb至下一个
		}else{//pa'项' 和 pb'项'都不为空, 且指数相同, 则累加系数
			//和的'多项式项' pa和pb的当前项, 指数不变,系数相加
			c = pa->c + pb->c;
			e = pa->e;
			
			pa = pa->next;	 //移动游标pa至下一个
			pb = pb->next;	 //移动游标pb至下一个
		}
		
		/**(2)根据 多项式'项'的: 系数c 和 指数e, 创建对应节点*/
		if( c ){
			pc->next=new NP; //创建1个新链表节点(多项式'项')
			pc=pc->next; //维护链表节点关系
			
			pc->c=c; //此链表节点(多项式'项')的系数c
			pc->e=e; //此链表节点(多项式'项')的指数e
		}
	}
	pc->next=NULL; //相加结果多项式的链尾指针=NULL
	
	return hc; //返回2个多多项式(链表)相加的结果
	//=====================================
}

NP *oneXmulty( NP *pa, NP *hb ){ //pa-某个多项式'项'; hb-一个多项式(多个'项'), 返回pa*ha的结果多项式:头指针
	//*************************************
	NP *hc, *pc, *pb=hb->next; //hc-多项式'项'pa 与 多项式hb 相乘的结果:头指针; pc-结果多项式hc的遍历指针; pb-多项式hb的遍历指针;
	
	hc=pc=new NP; //初始化结果多项式hc的头指针hc 和 游标指针pc
	while( pb ){  //遍历多项式hb, 每个'项'pb 都与 多项式'项'pa相乘 ==> 从而获得相乘后的结果多项式
		//(a)新节点创建 & 链表维护
		pc->next=new NP; //当前多项式'项'pb 与 多项式项'pa'相乘的结果'项'(节点)
		pc=pc->next;
		
		//(b)维护相乘多项式'项'(节点)的系数c和指数e
		pc->c=pa->c*pb->c;
		pc->e=pa->e+pb->e;
		
		//(c)移动游标指针 至 多项式hb的下一个多项式'项'(节点)
		pb=pb->next;
	}
	pc->next=NULL; //相乘结果多项式的链尾指针=NULL
	
	return hc;//返回结果多项式的头指针
	//=====================================
}

NP *multyXmulty( NP *ha, NP *hb ){ //实现两个多项式ha和hb的相乘, 返回结果多项式hc(链表头指针)
	//*************************************
	NP *hc; //hc-ha和hb相乘的结果多项式; t
	NP *pa = ha->next; //pa-第一个多项式ha的遍历指针---> 获得每个多项式'项'(节点)==>以乘于另一个多项式项hb
	NP *t; //t-ha的某个多项式'项'节点 与 另一个多项式hb的乘积=一个多项式t
	
	hc=new NP; //初始化结果多项式hc的: 链头指针
	hc->next=NULL; //初始化结果多项式hc的: 链尾指针
	
	while( pa ){ //若多项式ha存在节点'项'存在, 则(1)此ha的此多项式'项'乘于另一多项式hb; (2)并把结果累加到结果多项式hc
		//(A)ha的当前多项式'项'(节点) 乘于另一多项式hb, 得到一个多项式t
		t=oneXmulty( pa, hb );
		
		//(B)将多项式t累加到最终结果多项式hc中
		hc=addPoly( hc, t);
		
		//(C)多项式ha的下一个节点
		pa=pa->next;
		
		//(D)累加完t, 回收t占用的内存空间
		freePoly( t );
	}
	
	return hc; //返回两个多项式相乘的结果多项式:头指针
	//=====================================
}

int main(){
	int n, i; //n-多项式的个数; i-循环控制变量
	NP *hink[N0], *hc, *temp;	//hink[]-待相乘的若干个多项式的头指针; hc-多项式相乘结果头指针;
	
	FILE *fp;
	if((fp=fopen("conv.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("conv.in", "r", stdin);
		freopen("conv.out", "w", stdout);
	}
	
	scanf("%d", &n);	//输入多项式的个数n
	//******************************************
	/*(1)创建n个多项式链表*/
	for(i=0;i<n;i++){
		hink[i] = createPoly();	//创建多项式(对应于链表)
	}
	
	/*(2)进行n个多项式相乘*/
	temp=multyXmulty( hink[0], hink[1] );	
	for(i=2;i<n;i++){
		hc = multyXmulty( temp, hink[i]);	//调用函数进行多项式ha &  hb相乘, 结果存储在多项式hc中
		freePoly( temp );	//删除多项式相乘临时结果temp, 回收其所占用的内存空间
		temp = hc;
	}
	hc = temp;
	
	/*(3)输出n个多项式相乘的结果多项式 */
	printPoly( hc ); //打印输出相乘结果多项式
	
	
	/*(4)删除多项式hink[i] 和 hc, 回收其所占用的内存空间 */
	for(i=0;i<n;i++){
		freePoly( hink[i] );
	}
	freePoly( hc );	//删除多项式hc, 回收其所占用的内存空间
	//==========================================
	return 0;
}
在这里插入代码片
/*实现两个多项式相乘*/
#include "stdio.h"

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-结果多项式的链头和遍历游标指针; pa,pb-两个相加的多项式的遍历游标指针
	int c, e; //c,e-多项式'项'的系数和指数
	hc=pc=new NP; //初始化结果多项式的链头指针hc&遍历游标指针pc
	while( pa || pb ){
		/**(1)获得此次循环的 多项式'项'的: 系数c 和 指数e*/
		if( pa && (pb==NULL || pa->e < pb->e) ){ //[1]若pa'项'存在, 并且[(pb'项'为NULL) 或 (pa'项'的指数小于 pb的指数)], 即只处理pa'项'
			//和的'多项式项' 只包括pa的当前项
			c=pa->c;
			e=pa->e;

			pa=pa->next; //移动游标pa至下一个
		}else if( pb && (pa==NULL || pa->e > pb->e) ){ //[2], 与([1]类似, 只处理pb'项'
			//和的'多项式项' 只包括pa的当前项
			c=pb->c;
			e=pb->e;

			pb=pb->next; //移动游标pb至下一个
		}else{//[3], pa'项' 和 pb'项'都不为空, 且指数相同, 则累加系数
			//和的'多项式项' pa和pb的当前项, 指数不变,系数相加
			c = pa->c + pb->c;
			e = pa->e;

			pa = pa->next;	 //移动游标pa至下一个
			pb = pb->next;	 //移动游标pb至下一个
		}

		/**(2)根据 多项式'项'的: 系数c 和 指数e, 创建对应节点*/
		if( c ){
			pc->next=new NP; //创建1个新链表节点(多项式'项')
			pc=pc->next; //维护链表节点关系

			pc->c=c; //此链表节点(多项式'项')的系数c
			pc->e=e; //此链表节点(多项式'项')的指数e
		}
	}
	pc->next=NULL; //相加结果多项式的链尾指针=NULL

	return hc; //返回2个多多项式(链表)相加的结果
}

NP *oneXmulty( NP *pa, NP *hb ){ //pa-某个多项式'项'; hb-一个多项式(多个'项'), 返回pa*ha的结果多项式:头指针
	NP *hc, *pc, *pb=hb->next; //hc-多项式'项'pa 与 多项式hb 相乘的结果:头指针; pc-结果多项式hc的遍历指针; pb-多项式hb的遍历指针;
	
	hc=pc=new NP; //初始化结果多项式hc的头指针hc 和 游标指针pc
	while( pb ){  //遍历多项式hb, 每个'项'pb 都与 多项式'项'pa相乘 ==> 从而获得相乘后的结果多项式
		//(a)新节点创建 & 链表维护
		pc->next=new NP; //当前多项式'项'pb 与 多项式项'pa'相乘的结果'项'(节点)
		pc=pc->next;

		//(b)维护相乘多项式'项'(节点)的系数c和指数e
		pc->c=pa->c*pb->c;
		pc->e=pa->e+pb->e;

		//(c)移动游标指针 至 多项式hb的下一个多项式'项'(节点)
		pb=pb->next;
	}
	pc->next=NULL; //相乘结果多项式的链尾指针=NULL

	return hc;//返回结果多项式的头指针
}

NP *multyXmulty( NP *ha, NP *hb ){ //实现两个多项式ha和hb的相乘, 返回结果多项式hc(链表头指针)
	NP *hc; //hc-ha和hb相乘的结果多项式; 
	NP *pa = ha->next; //pa-第一个多项式ha的遍历指针---> 获得每个多项式'项'(节点)==>以乘于另一个多项式项hb
	NP *t; //t-ha的某个多项式'项'节点 与 另一个多项式hb的乘积=一个多项式t
	
	hc=new NP; //初始化结果多项式hc的: 链头指针
	hc->next=NULL; //初始化结果多项式hc的: 链尾指针

	while( pa ){ //若多项式ha存在节点'项'存在, 则(1)此ha的此多项式'项'乘于另一多项式hb; (2)并把结果累加到结果多项式hc
		//(A)ha的当前多项式'项'(节点) 乘于另一多项式hb, 得到一个多项式t
		t=oneXmulty( pa, hb );
		
		//(B)将多项式t累加到最终结果多项式hc中
		hc=addPoly( hc, t);

		//(C)多项式ha的下一个节点
		pa=pa->next;

		//(D)累加完t, 回收t占用的内存空间
		freePoly( t );
	}

	return hc; //返回两个多项式相乘的结果多项式:头指针
}

int main(){
	int n; //n-多项式的个数
	NP *ha, *hb, *hc;	//ha,hb-待相乘的两个多项式; hc-多项式相乘结果(仍为多项式)
	
	FILE *fp;
	if((fp=fopen("conv.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("conv.in", "r", stdin);
		freopen("conv.out", "w", stdout);
	}
	
	scanf("%d", &n);	//输入多项式的个数n

	ha=createPoly();	//创建多项式链表ha
	hb=createPoly();	//创建多项式链表hb
	//******************************************

	hc=multyXmulty( ha, hb);	//调用函数进行多项式ha &  hb相乘, 结果存储在多项式hc中

	printPoly( hc ); //打印输出相乘结果多项式
	
	//==========================================
	freePoly( ha );	//删除多项式ha, 回收其所占用的内存空间
	freePoly( hb );	//删除多项式hb, 回收其所占用的内存空间
	freePoly( hc );	//删除多项式hc, 回收其所占用的内存空间
	return 0;
}
在这里插入代码片
/*实现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-结果多项式的链头和遍历游标指针; pa,pb-两个相加的多项式的遍历游标指针
	int c, e; //c,e-多项式'项'的系数和指数
	hc=pc=new NP; //初始化结果多项式的链头指针hc&遍历游标指针pc
	while( pa || pb ){
		/**(1)获得次数循环的 多项式'项'的: 系数c 和 指数e*/
		if( pa && (pb==NULL || pa->e < pb->e) ){ //(1)若pa'项'存在, 并且[(pa'项'为NULL) 或 (pa'项'的指数小于 pb的指数)], 即只处理pa'项'
			//和的'多项式项' 只包括pa的当前项
			c=pa->c;
			e=pa->e;
			
			pa=pa->next; //移动游标pa至下一个
		}else if( pb && (pa==NULL || pa->e > pb->e) ){ //与(1)类似, 只处理pb'项'
			//和的'多项式项' 只包括pa的当前项
			c=pb->c;
			e=pb->e;
			
			pb=pb->next; //移动游标pb至下一个
		}else{//pa'项' 和 pb'项'都不为空, 且指数相同, 则累加系数
			//和的'多项式项' pa和pb的当前项, 指数不变,系数相加
			c = pa->c + pb->c;
			e = pa->e;
			
			pa = pa->next;	 //移动游标pa至下一个
			pb = pb->next;	 //移动游标pb至下一个
		}
		
		/**(2)根据 多项式'项'的: 系数c 和 指数e, 创建对应节点*/
		if( c ){
			pc->next=new NP; //创建1个新链表节点(多项式'项')
			pc=pc->next; //维护链表节点关系
			
			pc->c=c; //此链表节点(多项式'项')的系数c
			pc->e=e; //此链表节点(多项式'项')的指数e
		}
	}
	pc->next=NULL; //相加结果多项式的链尾指针=NULL
	
	return hc; //返回2个多多项式(链表)相加的结果
}

NP *oneXmulty( NP *pa, NP *hb ){ //pa-某个多项式'项'; hb-一个多项式(多个'项'), 返回pa*ha的结果多项式:头指针
	NP *hc, *pc, *pb=hb->next; //hc-多项式'项'pa 与 多项式hb 相乘的结果:头指针; pc-结果多项式hc的遍历指针; pb-多项式hb的遍历指针;
	
	hc=pc=new NP; //初始化结果多项式hc的头指针hc 和 游标指针pc
	while( pb ){  //遍历多项式hb, 每个'项'pb 都与 多项式'项'pa相乘 ==> 从而获得相乘后的结果多项式
		//(a)新节点创建 & 链表维护
		pc->next=new NP; //当前多项式'项'pb 与 多项式项'pa'相乘的结果'项'(节点)
		pc=pc->next;
		
		//(b)维护相乘多项式'项'(节点)的系数c和指数e
		pc->c=pa->c*pb->c;
		pc->e=pa->e+pb->e;
		
		//(c)移动游标指针 至 多项式hb的下一个多项式'项'(节点)
		pb=pb->next;
	}
	pc->next=NULL; //相乘结果多项式的链尾指针=NULL
	
	return hc;//返回结果多项式的头指针
}

NP *multyXmulty( NP *ha, NP *hb ){ //实现两个多项式ha和hb的相乘, 返回结果多项式hc(链表头指针)
	NP *hc; //hc-ha和hb相乘的结果多项式; t
	NP *pa = ha->next; //pa-第一个多项式ha的遍历指针---> 获得每个多项式'项'(节点)==>以乘于另一个多项式项hb
	NP *t; //t-ha的某个多项式'项'节点 与 另一个多项式hb的乘积=一个多项式t
	
	hc=new NP; //初始化结果多项式hc的: 链头指针
	hc->next=NULL; //初始化结果多项式hc的: 链尾指针
	
	while( pa ){ //若多项式ha存在节点'项'存在, 则(1)此ha的此多项式'项'乘于另一多项式hb; (2)并把结果累加到结果多项式hc
		//(A)ha的当前多项式'项'(节点) 乘于另一多项式hb, 得到一个多项式t
		t=oneXmulty( pa, hb );
		
		//(B)将多项式t累加到最终结果多项式hc中
		hc=addPoly( hc, t);
		
		//(C)多项式ha的下一个节点
		pa=pa->next;
		
		//(D)累加完t, 回收t占用的内存空间
		freePoly( t );
	}
	
	return hc; //返回两个多项式相乘的结果多项式:头指针
}

int main(){
	int n, i; //n-多项式的个数; i-循环控制变量
	NP *hink[N0], *hc, *temp;	//hink[]-待相乘的若干个多项式的头指针; hc-多项式相乘结果头指针;
	
	FILE *fp;
	if((fp=fopen("conv.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("conv.in", "r", stdin);
		freopen("conv.out", "w", stdout);
	}
	
	scanf("%d", &n);	//输入多项式的个数n
	//******************************************
	/*(1)创建n个多项式链表*/
	for(i=0;i<n;i++){
		hink[i] = createPoly();	//创建多项式(对应于链表)
	}
	
	/*(2)进行n个多项式相乘*/
	temp=multyXmulty( hink[0], hink[1] );	
	for(i=2;i<n;i++){
		hc = multyXmulty( temp, hink[i]);	//调用函数进行多项式ha &  hb相乘, 结果存储在多项式hc中
		freePoly( temp );	//删除多项式相乘临时结果temp, 回收其所占用的内存空间
		temp = hc;
	}
	hc = temp;
	
	/*(3)输出n个多项式相乘的结果多项式 */
	printPoly( hc ); //打印输出相乘结果多项式
	
	
	/*(4)删除多项式hink[i] 和 hc, 回收其所占用的内存空间 */
	for(i=0;i<n;i++){
		freePoly( hink[i] );
	}
	freePoly( hc );	//删除多项式hc, 回收其所占用的内存空间
	//==========================================
	return 0;
}
在这里插入代码片
/*功 能: 实现n个多项式相乘. 系数为:double型; 指数(次数)为: int型;
 *原 理: 两个多项式的系数f分别存在数组 x[]和y[]中,下标即为次数,*Max表示本多项式最高次数.

 */
#include "stdio.h"
#include "string.h"
const int N0=100;	//常数: 多项式最多N0个

/**
 * 读取数据,多项式的信息存储与数组poly[][]中,最高次数存储于数组exp[]. 注意:一行一个多项式,一个最高次数,共n行.
 */
void getPolynomial(double poly[][N0], int exp[], int n){
	double c;		//c-系数(coefficient); 
	int e, i;		//e-指数(exponent); i-(行)循环控制变量

	for(i=0; i<n; i++){ //输入n个多项式的信息(1行对应一个多项式, 长短不一)
		int maxExp=0; //多项式最高次数(指数)
		/*(1)获得多项式的系数和指数信息, 同时收集(更新)最高指数的信息*/
		while( true ){
			scanf("%lf%d", &c, &e);	//输入多项式项 ==> 根据输入数据的特点: 系数+指数 紧接着出现!
			//printf("c=%.3lf, e=%d; ", c, e);

			if( c==0 && e==0 ){	//根据约定, 系数 & 指数 都为0, 则多项式输入结束
				break;
			}
			
			poly[i][e] = c; //更新下标为e的多项式项的系数,下标e即为次数e
			
			if(e > maxExp){ //若有更高次数,则更新最高次数
				maxExp = e;
			}		
		}

		/*(2)记录当前多项式(第i个多项式)的最高指数信息*/
		exp[i] = maxExp;
		//printf("--->maxExp=%d \n", maxExp);
	}
}

/**
 *两个多项式x和y(系数分别存在x[]和y[]中,下标即为次数)相乘, 结果存储在result(也是一个多项式)中, *Max表示本多项式的最高次数.
 */
int polyMultiply(double x[], int xMax, double y[], int yMax, double result[], int *resultMax) {
    int i=0, k=0;
	
    *resultMax = xMax + yMax;//获取最新的最高次数
    memset(result, 0, (1+*resultMax)*sizeof(double));
	
    for(i=0; i<=xMax; i++) {//两个多项式相乘    
        for(k=0; k<=yMax; k++) {//下标即为变量的次数
            result[i+k] += x[i] * y[k];
        }
    }
	
    //运算完成后,result[]即为结果的系数,其下标为次数; (*resultMax)即为result[]的最高次数	
    return 0;
}

/**
 *打印输出一个多项式的信息
 */
void printPolynomial(double poly[], int maxExp){ 
	int j; //j-循环控制变量
	for(j=0; j<=maxExp; j++){
		if(poly[j] != 0 ){//系数不为0, 则输出多项式'项'的系数poly[j] & 指数j. 否则, 不输出!
			printf("%.3lf %d ", poly[j], j);
		}
	}
	printf("\n"); //输出一个多项式后换行
}

int main(){
	int n, i; //n-多项式的个数; i-循环控制变量
	double polyNomial[N0][N0]={0}; //polyNomial - n个多项式, 每行1个多项式,长短不一
	int polyExponent[N0]; //polyExponent - n个多项式之每个多项式的最高指数
	
	double rsPolyNomial[N0] = {0}; //rsPolyNomial - 多项式相乘的结果, 所有元素的初始值皆为0
	double tempPoly[N0] = {0}; //tempPoly - 多于2个多项式相乘时, 用于存储相乘结果的临时数组(对应于一个多项式), 所有元素的初始值皆为0
	int rsPolyExponent, tempExp; //rsPolyExponent - 多项式相乘结果的最高指数(exponent)
	
	FILE *fp;
	if((fp=fopen("conv.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("conv.in", "r", stdin);
		freopen("conv.out", "w", stdout);
	}
	
	scanf("%d", &n);	//输入多项式的个数n
	if(n<2 || n>30){
		printf("输入的多项式数目少于2 或 超过最大数目30个!\n");
		return 1;
	}
	//******************************************
	/*(1)读取多项式数据信息(预处理 获得每个多项式的最高次数(指数))*/
	getPolynomial(polyNomial, polyExponent , n);
	for(i=0; i<n; i++)	printPolynomial(polyNomial[i], polyExponent[i]); //输出各多项式的信息

	/*(2)进行n个多项式相乘*/
	polyMultiply( polyNomial[0], polyExponent[0], polyNomial[1], polyExponent[1], rsPolyNomial, &rsPolyExponent);
	for(i=2; i<n; i++){
		/*(A)将两个多项式相乘的临时结果(也是多项式)-rsPolyNomial, 拷贝到临时空间tempPoly*/
		/**(A1)方法1*/
		memcpy(tempPoly, rsPolyNomial, (1+rsPolyExponent)*sizeof(double));//从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
		/**(A1)方法2*/
		// for(int j = 0; j<=rsPolyExponent; j++){
		//	tempPoly[j] = rsPolyNomial[j];
		// 	}
		tempExp = rsPolyExponent; 

		/*(B)再次使用数组之前,要先把其中的数据清空 --> 这个工作统一在多项式相乘函数polyMultiply(...)中做 */
		//memset(rsPolyNomial, 0, (1+rsPolyExponent)*sizeof(int));

		/*(C)两个多项式相乘的结果与另一个多项式polyNomial[i] 相乘*/
		polyMultiply(tempPoly, tempExp, polyNomial[i], polyExponent[i], rsPolyNomial, &rsPolyExponent);
	}
	
	/*(3)输出n个多项式相乘的结果多项式rsPolyNomial */
	printPolynomial( rsPolyNomial, rsPolyExponent);

	//==========================================
	return 0;
}
在这里插入代码片
/*功 能: 实现n个多项式相乘. 系数为:int型; 指数(次数)为: int型【指数不能为负】;
 *原 理: 两个多项式的系数f分别存在数组 x[]和y[]中,下标即为次数,*Max表示本多项式最高次数.

 */
#include "stdio.h"
#include "string.h"
const int N0=100;	//常数: 多项式最多N0个

/**
 * 读取数据,多项式的信息存储与数组poly[][]中,最高次数存储于数组exp[]. 注意:一行一个多项式,一个最高次数,共n行.
 */
void getPolynomial(int poly[][N0], int exp[], int n){
	int c, e, i;		//c-系数(coefficient); e-指数(exponent); i-(行)循环控制变量

	for(i=0; i<n; i++){ //输入n个多项式的信息(1行对应一个多项式, 长短不一)
		int maxExp=0; //多项式最高次数(指数)
		/*(1)获得多项式的系数和指数信息, 同时收集(更新)最高指数的信息*/
		while( true ){
			scanf("%d%d", &c, &e);	//输入多项式项 ==> 根据输入数据的特点: 系数+指数 紧接着出现!
			//printf("c=%d, e=%d; ", c, e);

			if( c==0 && e==0 ){	//根据约定, 系数 & 指数 都为0, 则多项式输入结束
				break;
			}
			
			poly[i][e] = c; //更新下标为e的多项式项的系数,下标e即为次数e
			
			if(e > maxExp){ //若有更高次数,则更新最高次数
				maxExp = e;
			}		
		}

		/*(2)记录当前多项式(第i个多项式)的最高指数信息*/
		exp[i] = maxExp;
		//printf("--->maxExp=%d \n", maxExp);
	}
}

/**
 *两个多项式x和y(系数分别存在x[]和y[]中,下标即为次数)相乘, 结果存储在result(也是一个多项式)中, *Max表示本多项式的最高次数.
 */
int polyMultiply(int x[], int xMax, int y[], int yMax, int result[], int *resultMax) {
    int i=0, k=0;
	
    *resultMax = xMax + yMax;//获取最新的最高次数
    memset(result, 0, (1+*resultMax)*sizeof(int));
	
    for(i=0; i<=xMax; i++) {//两个多项式相乘    
        for(k=0; k<=yMax; k++) {//下标即为变量的次数
            result[i+k] += x[i] * y[k];
        }
    }
	
    //运算完成后,result[]即为结果的系数,其下标为次数; (*resultMax)即为result[]的最高次数	
    return 0;
}

/**
 *打印输出一个多项式的信息
 */
void printPolynomial(int poly[], int maxExp){ 
	int j; //j-循环控制变量
	for(j=0; j<=maxExp; j++){
		if(poly[j] != 0 ){//系数不为0, 则输出多项式'项'的系数poly[j] & 指数j. 否则, 不输出!
			printf("%d %d ", poly[j], j);
		}
	}
	printf("\n"); //输出一个多项式后换行
}

int main(){
	int n, i; //n-多项式的个数; i-循环控制变量
	int polyNomial[N0][N0]={0}; //polyNomial - n个多项式, 每行1个多项式,长短不一
	int polyExponent[N0]; //polyExponent - n个多项式之每个多项式的最高指数
	
	int rsPolyNomial[N0] = {0}; //rsPolyNomial - 多项式相乘的结果, 所有元素的初始值皆为0
	int tempPoly[N0] = {0}; //tempPoly - 多于2个多项式相乘时, 用于存储相乘结果的临时数组(对应于一个多项式), 所有元素的初始值皆为0
	int rsPolyExponent, tempExp; //rsPolyExponent - 多项式相乘结果的最高指数(exponent)
	
	FILE *fp;
	if((fp=fopen("conv.in", "r")) != NULL ){
		fclose(fp);  //存在的话,要先把之前打开的文件关掉
		
		freopen("conv.in", "r", stdin);
		freopen("conv.out", "w", stdout);
	}
	
	scanf("%d", &n);	//输入多项式的个数n
	if(n<2 || n>30){
		printf("输入的多项式数目少于2 或 超过最大数目30个!\n");
		return 1;
	}
	//******************************************
	/*(1)读取多项式数据信息(预处理 获得每个多项式的最高次数(指数))*/
	getPolynomial(polyNomial, polyExponent , n);
	//for(i=0; i<n; i++)	printPolynomial(polyNomial[i], polyExponent[i]); //输出各多项式的信息

	/*(2)进行n个多项式相乘*/
	polyMultiply( polyNomial[0], polyExponent[0], polyNomial[1], polyExponent[1], rsPolyNomial, &rsPolyExponent);
	for(i=2; i<n; i++){
		/*(A)将两个多项式相乘的临时结果(也是多项式)-rsPolyNomial, 拷贝到临时空间tempPoly*/
		/**(A1)方法1*/
		memcpy(tempPoly, rsPolyNomial, (1+rsPolyExponent)*sizeof(int));//从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
		/**(A1)方法2*/
		// for(int j = 0; j<=rsPolyExponent; j++){
		//	tempPoly[j] = rsPolyNomial[j];
		// 	}
		tempExp = rsPolyExponent; 

		/*(B)再次使用数组之前,要先把其中的数据清空 --> 这个工作统一在多项式相乘函数polyMultiply(...)中做 */
		//memset(rsPolyNomial, 0, (1+rsPolyExponent)*sizeof(int));

		/*(C)两个多项式相乘的结果与另一个多项式polyNomial[i] 相乘*/
		polyMultiply(tempPoly, tempExp, polyNomial[i], polyExponent[i], rsPolyNomial, &rsPolyExponent);
	}
	
	/*(3)输出n个多项式相乘的结果多项式rsPolyNomial */
	printPolynomial( rsPolyNomial, rsPolyExponent);

	//==========================================
	return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值