一元多项式的运算(加、减、乘)C 实现

/*==========================================
A: 1*(x^2) + 2*(x^3) +....+ 4*(x^15) + ...
B: 5*(x^2) + 4*(x^4) +....+ 8*(x^15) + ...
计算  A + B ,A - B ,A * B = ?
测试数据: 
5
-2  1
 4 -5
-5  1
 6  8
 9  8
3
 3  0
 2 -2
-1 -2
==========================================*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
	int list_coe;
	int list_index;
	struct node *next;
}*linklist,listnode;

void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp; }//交换两个数 
void lsort(int *index ,int *coe,int len)          //降序排列 
{
	int i,j;
	for( i = 0 ; i < len-1 ; i ++)
		for( j = i+1;j < len;j ++ ){
			if( *( index + i ) < *( index + j) ){
				swap( (index + i) , (index + j) );
				swap( (coe + i) , (coe + j) );
			}
        }
}
int cmp(int a,int b) { return ((a > b)?1:(a < b?-1:0)); }   //比较大小 
linklist create_list(int *coe,int *index,int length)       // 建立链表 
{
	linklist head = NULL,p;
	int i;
	for(i = 0;i < length;i ++)               //头插法,倒序 
	{
		p = (listnode*)malloc(sizeof(listnode));
		p->list_coe = *(coe + i);
		p->list_index = *(index + i);
		p->next = head;
		head = p;
	}
	return (head);
}
linklist add_list(linklist head0,linklist head1)           //相加函数 
{
	linklist sum,p,q,r,head;
	p = head0;
    q = head1;
    sum = NULL;
	while( p && q )
	{
		r = (linklist)malloc(sizeof(listnode));
		switch( cmp( p->list_index , q->list_index ) )//方法与减法函数类似 
		{
			case 1 :
				r->list_coe = q->list_coe;
				r->list_index = q->list_index;
				q = q->next;
				break;
			case 0 :
				r->list_coe = p->list_coe + q->list_coe;
				r->list_index = p->list_index;
				p = p->next;
				q = q->next;
				break;
			case -1:
				r->list_coe = p->list_coe;
				r->list_index = p->list_index;
				p = p->next;
				break;
        }
	    if(sum == NULL)
            head = r;
        else
            sum->next = r;
        sum = r;
	}
	if(p == NULL)
		sum->next = q;
	else
		sum->next = p;
	return (head);
}
linklist min_list(linklist head0,linklist head1)        //相减函数 
{
    linklist head,p,q,r,min;
    min = head = NULL;      //新表的头尾指针 ,尾插法建立新表 (差) 
    p = head0; q = head1;
    while( p && q )
	{
		r = (linklist)malloc(sizeof(listnode));
		switch( cmp( p->list_index , q->list_index ) )   //根据两链表的节点值大小选择将插入到新表中的结点 
		{
			case 1 :                 //将指数小的先插入 
				r->list_coe = q->list_coe * (-1);
				r->list_index = q->list_index;
				q = q->next;
				break;
			case 0 :                 //指数相等时将两结点的系数相减放入新表 
				r->list_coe = p->list_coe - q->list_coe;
				r->list_index = p->list_index;
				p = p->next;
				q = q->next;
				break;
			case -1:                          
				r->list_coe = p->list_coe;
				r->list_index = p->list_index;
				p = p->next;
				break;
        }
	    if(min == NULL)
            head = r;
        else
            min->next = r;
        min = r;
	}
	if(p == NULL)
		min->next = q;
	else
		min->next = p;
	return (head);
}
linklist chen_list(linklist head0,linklist head1)       //相乘函数 
{
    linklist p,q,r;
	linklist head[100],maf[100];           //用指针数组,每个指针指向的链都是
	int i = 0,j;                           //一个多项式中的一项跟另一个多项式中全部项的乘积 
    p = head0;                             //然后将这多条链表相加即可 
    while(p)
    {
        head[i] = NULL;
		maf[i] = head[i];
		q = head1;
        while(q) //相乘时,指数相加,系数相乘,赋给新表的结点中的值 
		{
			r = (linklist)malloc(sizeof(listnode)); 
			r->list_coe = p->list_coe * q->list_coe;
			r->list_index = p->list_index + q->list_index;
			if(maf[i] == NULL)
				head[i] = r;
			else
				maf[i]->next = r;
			maf[i] = r;
            q = q->next;
		}
		maf[i]->next = NULL;
		i ++;      //一共有 i 条链 
		p = p->next;
    }
	linklist sum;        //sum 为多条链相加后的新链的头指针 
	sum = add_list(head[0],head[1]);
	for(j = 2;j < i;j ++)
		sum = add_list(sum,head[j]);
	return (sum);
}
void print_list(linklist head)
{
	linklist p = head;
	while(p)
	{
		printf("%d*",p->list_coe);
		printf(p->list_index >= 0 ? "(x^%d)" : "(x^(%d))" , p->list_index);
		p = p->next; 
		if(p) { if(p->list_coe >= 0) printf("+"); }
        else printf("\n\n");
	}
}
void bing_list(int *index , int *coe , int *len)  //合并同类项
{
	int f = 1,h,u,i;
	for(i = 1;i < *len ;)
	{
		for(h = 0;h < f;h ++)
		{
			if( *(index + i) == *(index + h) )//后面的指数有跟前面的相等,则将前项将后项系数加上 
			{
				*(coe + h) += *(coe + i);
				break;
			}
		}
		if(h >= f) { f ++; i ++ ; }
		else 
        {
			for(u = i+1;u < *len;u ++)  //有相同项则将后面的逐项前移 
			{
				*(coe + u-1) = *(coe + u);
				*(index + u-1) = *(index + u);
			}
			(*len) --;
		}
	}
}
int main(int argc, char *argv[])
{
    linklist head[2];   //指向两个多项式的头指针 
    linklist sum,lit,pro;//和,差,积
	int coefficient[20],index[20],length[2];//系数,指数,项数 
	int i,j,h,f,u;
	for(j = 0;j < 2 ;j ++)
	{
        printf("请输入第%d个多项式的项数:",j+1); 
		scanf("%d",&length[j]);
		printf("请输入%d组数据,每组包括系数和指数!\n",length[j]);
		for(i = 0;i < length[j];i ++)
 	        scanf("%d%d",&coefficient[i],&index[i]);
		bing_list( index , coefficient , &length[j] );//将输入数据合并同类项 
		lsort( index , coefficient , length[j]);
		head[j] = create_list( coefficient , index , length[j] );
		printf("构造的多项式为:\t");
		print_list( head[j] );
	} 
	printf("两多项式进行运算\n\n"); 
	sum = add_list( head[0] , head[1] );
    printf("相加得: ");
    print_list(sum);
    
    lit = min_list(head[0],head[1]);
    printf("相减得: ");
    print_list(lit);
    
    pro = chen_list(head[0],head[1]);
    printf("相乘得: ");
    print_list(pro);
    system("PAUSE");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一元多项式乘除的C语言数组实现: 1. 定义一元多项式的结构体 ```c #define MAXN 1000 // 多项式最大项数 struct Polynomial{ int coef[MAXN]; // 系数数组 int exp[MAXN]; // 指数数组 int len; // 多项式项数 }; ``` 2. 初始化多项式 ```c void InitPoly(Polynomial &P){ memset(P.coef, 0, sizeof(P.coef)); // 初始化系数数组为 0 memset(P.exp, 0, sizeof(P.exp)); // 初始化指数数组为 0 P.len = 0; // 初始化项数为 0 } ``` 3. 多项式法 ```c void AddPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] + B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项入 C 中 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 4. 多项式法 ```c void SubPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] - B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项入 C 中 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 5. 多项式乘法 ```c void MulPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 for(int i = 0; i < A.len; i++) for(int j = 0; j < B.len; j++){ int k = A.exp[i] + B.exp[j]; C.coef[k] += A.coef[i] * B.coef[j]; // 累系数乘积 } for(int i = 0; i < MAXN; i++) if(C.coef[i] != 0){ // 记录非零项 C.exp[C.len] = i; C.len++; } } ``` 6. 多项式除法 ```c void DivPoly(Polynomial A, Polynomial B, Polynomial &Q, Polynomial &R){ InitPoly(Q); // 初始化商多项式为 0 InitPoly(R); // 初始化余数多项式为 0 for(int i = A.len - 1; i >= 0; i--){ // 从高次项开始除 int k = A.exp[i] - B.exp[B.len - 1]; if(k < 0) break; // 除数次数超过被除数 int c = A.coef[i] / B.coef[B.len - 1]; // 计算系数 Q.coef[k] = c; // 存储商系数 Q.exp[Q.len] = k; // 存储商指数 Q.len++; for(int j = 0; j < B.len; j++){ // 去被除数乘以商 int t = k + B.exp[j]; A.coef[i - B.len + j + 1] -= c * B.coef[j]; } } for(int i = A.len - 1; i >= B.len - 1; i--){ // 存储余数 if(A.coef[i] != 0){ R.coef[R.len] = A.coef[i]; R.exp[R.len] = A.exp[i]; R.len++; } } } ``` 以上就是一元多项式乘除的C语言数组实现。需要注意的是,在进行除法运算时,被除数必须是单项式,即只有一项,而除数可以是多项式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值