关于整数域一元多项式的加减乘运算

关于整数域一元多项式的加减乘运算

编译环境:VC++6.0

运行截图:
关于整数域一元多项式的加减乘运算
关于整数域一元多项式的加减乘运算关于整数域一元多项式的加减乘运算关于整数域一元多项式的加减乘运算
关于整数域一元多项式的加减乘运算
关于整数域一元多项式的加减乘运算
源代码:

#include<stdio.h>
#include<windows.h>
#define POLYSIZE 10
/*******************************/
/*结构体定义*/
typedef struct term
{
	int coe;//coefficient(系数)
	int ind;//index(指数)
}Term;//term(项)
typedef struct polynomial
{
	int length;//存放多项式的长度
	Term* base;//存放多项式存储空间的基地址
}Poly;//polynomial(多项式)
/*******************************/
/*生成一个多项式*/
Poly makePoly(int n)
{
	Poly temp;
	temp.base = (Term*)malloc( sizeof(Term) * n );//为多项式分配存储空间,并保存基地址
	temp.length = n;
	return temp;
}
/*******************************/
/*生成多项式的一项*/
Term makeTerm(int c ,int i)
{
	Term t;
	t.coe = c;
	t.ind = i;
	return t;//返回给定系数与指数所生成的项
}
/*******************************/
/*对多项式进行初始化*/
void initPoly(Poly* p)
{
	for( int i=0;i < p->length;i++ )
	{
		int tc,ti;//要确保输入的数据合理
		while(1)
		{
			printf("请输入第%d项的系数:",i+1);
			if( scanf("%d",&tc) == 1 )
				break;
			else
				printf("请输入正确的数字\n");
			while( getchar() != '\n' );
		}
		while(1)
		{
			printf("请输入第%d项的指数:",i+1);
			if( scanf("%d",&ti) == 1 )
				break;
			else
				printf("请输入正确的数字\n");
			while( getchar() != '\n' );
		}
		*(p->base+i) = makeTerm(tc,ti);
	}
}
/*******************************/
/*按项的指数降序排序*/
void sort(Poly* p)
{
	Term* b = p->base;
	Term t;
	for( int i = 0; i < p->length-1; i++ )//冒泡排序法
	{
		for( int j = 0; j < p->length-1-i; j++ )
		{
			if( (b+j)->ind < (b+j+1)->ind )
			{
				t = *(b+j);
				*(b+j) = *(b+j+1);
				*(b+j+1) = t;
			}
			if( (b+j)->ind == (b+j+1)->ind )
			{
				(b+j)->coe += (b+j+1)->coe;
				(b+j+1)->coe = 0;
			}
		}
	}
	for( i = 0; i < p->length; i++ )//清理系数为0的项
	{
		if( (b+i)->coe == 0 )
		{
			int j = i;
			while( j != p->length-1 )
			{
				t = *(b+j);
				*(b+j) = *(b+j+1);
				*(b+j+1) = t;
				j++;
			}
			p->length--;
		}
	}
}//排序函数(降序)
/*******************************/
/*显示某个多项式*/
void display(Poly* p)
{
	sort(p);
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄,目的是修改输出颜色
	Term* t = p->base;
	for( int i = 0; i < p->length; i++ )
	{
		SetConsoleTextAttribute(hConsole,0xF);
		if( (t+i)->coe > 0 )
		{
			if( i != 0 )	
				printf(" + ");
			SetConsoleTextAttribute(hConsole,0xb);
			if( (t+i)->coe != 1 )    
				printf("%d",(t+i)->coe);
		}
		else if( (t+i)->coe < 0 )
		{   printf(" - ");
			SetConsoleTextAttribute(hConsole,0xb);
			if( (t+i)->coe != -1 )
				printf("%d",-(t+i)->coe);
		}
		if( (t+i)->ind == 0 )
			continue;
		SetConsoleTextAttribute(hConsole,0xF);
		printf("x");
		if( (t+i)->ind == 1 )
			continue;
		printf("^");
		SetConsoleTextAttribute(hConsole,0xC);
		printf("%d",(t+i)->ind);
		
	}
	SetConsoleTextAttribute(hConsole,0xF);
	printf("\n");
}
/*******************************/
/*多项式加法*/
void addPoly(int m, int n, Poly* p)
{
	int ml = (p+m)->length;
	int nl = (p+n)->length;
	p->base = (Term*)malloc( sizeof(Term) * (ml+nl) );
	Term* mb = (p+m)->base;
	Term* nb = (p+n)->base;
	Term* pb = p->base;
	int i = 0, j = 0, k = 0;
	while(1)
	{
		if( i == ml )
		{
			while( j != nl )
			{
				*(pb+k) = *(nb+j);
				j++;
				k++;
			}
			break;
		}
		else if(j == nl)
		{
			while( i != ml )
			{
				*(pb+k) = *(mb+i);
				i++;
				k++;
			}
			break;
		}
		if( (mb+i)->ind > (nb+j)->ind )
		{
			*(pb+k) = *(mb+i);
			i++;
		}
		else if( (mb+i)->ind == (nb+j)->ind )
		{
			*(pb+k) = *(mb+i);
			(pb+k)->coe += (nb+j)->coe;
			i++;
			j++;
		}
		else if( (mb+i)->ind < (nb+j)->ind )
		{
			*(pb+k) = *(nb+j);
			j++;
		}
		k++;
	}
	p->length = k;
}
/*******************************/
/*多项式减法*/
void subPoly(int m, int n, Poly* p)
{
	int ml = (p+m)->length;
	int nl = (p+n)->length;
	p->base = (Term*)malloc( sizeof(Term) * (ml+nl) );
	Term* mb = (p+m)->base;
	Term* nb = (p+n)->base;
	Term* pb = p->base;
	int i = 0, j = 0, k = 0;
	while(1)
	{
		if( i == ml )
		{
			while( j != nl )
			{
				*(pb+k) = *(nb+j);
				(pb+k)->coe = -(pb+k)->coe;
				j++;
				k++;
			}
			break;
		}
		else if(j == nl)
		{
			while( i != ml )
			{
				*(pb+k) = *(mb+i);
				i++;
				k++;
			}
			break;
		}
		if( (mb+i)->ind > (nb+j)->ind )
		{
			*(pb+k) = *(mb+i);
			i++;
		}
		else if( (mb+i)->ind == (nb+j)->ind )
		{
			*(pb+k) = *(mb+i);
			(pb+k)->coe -= (nb+j)->coe;
			i++;
			j++;
		}
		else if( (mb+i)->ind < (nb+j)->ind )
		{
			*(pb+k) = *(nb+j);
			(pb+k)->coe = -(pb+k)->coe;
			j++;
		}
		k++;
	}
	p->length = k;
}
/*******************************/
/*多项式乘法*/
void mulPoly(int m, int n, Poly* p)
{
	int ml = (p+m)->length;
	int nl = (p+n)->length;
	p->base = (Term*)malloc( sizeof(Term) * (ml*nl) );
	Term* mb = (p+m)->base;
	Term* nb = (p+n)->base;
	Term* pb = p->base;
	int k = 0;
	for( int i = 0; i < ml; i++)
	{
		for( int j = 0; j < nl; j++)
		{
			*(pb+k) = *(mb+i);
			(pb+k)->coe *= (nb+j)->coe;
			(pb+k)->ind += (nb+j)->ind;
			k++;
		}
	}
	p->length = k;
}
/*******************************/
/*编号输入时的检查*/
int inCheck()
{
	int x;
	while(1)
	{
		printf("请输入多项式编号:");
		scanf("%d",&x);
		if( x >= 1 && x <= POLYSIZE )
			break;
		else
			printf("输入有误,请重新输入(编号应位于1-%d之间)\n",POLYSIZE);
		while( getchar() != '\n' );
	}
	return x;
}
/*******************************/
int main ()
{
	Poly* p;
	//分配一定空间存放Poly变量,其中第0个用于存放结果
	//其余用于存放输入的多项式
	p = (Poly*)malloc( sizeof(Poly) * (POLYSIZE+1) );
	while(1)
	{
		int m = 0, n = 0, c = 0;
		system("cls"); 
		printf("\n\n请按所选功能输入数字:\n");
		printf("\t1.添加新的多项式\n");
		printf("\t2.查看现有的多项式\n");
		printf("\t3.多项式相加并输出\n");
		printf("\t4.多项式相减并输出\n");
		printf("\t5.多项式相乘并输出\n");
		printf("\t0.退出程序\n");
		scanf("%d",&c);
		switch(c)
		{
		    case 0:
				exit(0);
			case 1:
				{
					int x = 0,n = 0;
					x = inCheck();
					while(1)
					{
						printf("请输入多项式的项数:");
						scanf("%d",&n);
						if( n >= 2 )
							break;
						else
							printf("输入有误,请重新输入(项数应大于等于2)\n");
						while( getchar() != '\n' );
					}
					*(p+x) = makePoly(n);
					initPoly(p+x);
					printf("添加成功!编号为%d的多项式:\n\n\ty%d = ",x,x);
					display(p+x);
				}
				break;
			case 2:
				{
					int x;
					x = inCheck();
					printf("编号为%d的多项式:\n\n\ty%d = ",x,x);
					display(p+x);
				}
				break;
			case 3:
				{
					m = inCheck();
					n = inCheck();
					addPoly(m,n,p);//add(加法)
					printf("运算的结果是:\n\tresult = ");
					display(p);
					free(p->base);//将存放结果的空间释放
				}
				break;
			case 4:
				{
					m = inCheck();
					n = inCheck();
					subPoly(m,n,p);//subtract(减法)
					printf("运算的结果是:\n\tresult = ");
					display(p);
					free(p->base);
				}
				break;
			case 5:
				{
					m = inCheck();
					n = inCheck();
					mulPoly(m,n,p);//multiply(乘法)
					printf("运算的结果是:\n\tresult = ");
					display(p);
					free(p->base);
				}
				break;
		}
		system("pause");
	}
	return 0;
}