关于整数域一元多项式的加减乘运算
关于整数域一元多项式的加减乘运算
编译环境: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;
}