PAT 3-04 一元多项式的乘法与加法运算(C语言实现)

原创 2014年10月03日 15:14:00

题目描述:

设计函数分别求两个一元多项式的乘积与和。

输入格式说明:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式说明:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。

样例输入与输出:

序号 输入 输出
1
4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
2
2 1 2 1 0
2 1 2 -1 0
1 4 -1 0
2 2
3
2 -1000 1000 1000 0
2 1000 1000 -1000 0
-1000000 2000 2000000 1000 -1000000 0
0 0
4
0
1 999 1000
0 0
999 1000

解答说明:

链表的每一个节点储存有系数和指数。
求和的时候如果指数相等,则将系数相加,注意系数和为0的情况。
求积的过程相当于多次多次求和的过程,调用求和函数累加即可。

源码:
#include<stdio.h>
#include<stdlib.h>

typedef struct node *ptrNode;
typedef ptrNode LinkList;  //头结点
typedef ptrNode Position;//中间节点
typedef int ElementType;
struct node{
	ElementType Coefficient;
	ElementType Exponent;
	Position next;
};

int IsEmpty(LinkList L)
{
	return L->next == NULL;
}

LinkList creatList(int n)
{
	LinkList head,r,p;
	int coe,exp;
	head = (struct node*)malloc(sizeof(struct node));    //生成新结点
	r = head;

	while(n--){
        scanf("%d%d",&coe,&exp);
		p = (struct node*)malloc(sizeof(struct node));
		p->Coefficient = coe;
        p->Exponent = exp;
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return head;
}

LinkList add_List(LinkList a, LinkList b)
{
	Position ha, hb;
	LinkList c,r,p;
	int temp;

	ha = a->next;
	hb = b->next;

	c = (struct node*)malloc(sizeof(struct node));
	r = c;
	while((ha != NULL)&&(hb != NULL)){
		p = (struct node*)malloc(sizeof(struct node));
		if(ha->Exponent < hb->Exponent){
			p->Exponent = hb->Exponent;
			p->Coefficient = hb->Coefficient;
			hb = hb->next;
            r->next = p;
            r = p;
		}
		else if(ha->Exponent > hb->Exponent){
			p->Exponent = ha->Exponent;
			p->Coefficient = ha->Coefficient;
			ha = ha->next;
            r->next = p;
            r = p;
		}
		else{
            temp = ha->Coefficient + hb->Coefficient;
            if(temp != 0){
                p->Exponent = ha->Exponent;
                p->Coefficient = temp;
                r->next = p;
                r = p;
            }
            hb = hb->next;
            ha = ha->next;
        }
	}
	if(ha == NULL){
		while(hb != NULL){
			p = (struct node*)malloc(sizeof(struct node));
			p->Exponent = hb->Exponent;
			p->Coefficient = hb->Coefficient;
			hb = hb->next;
			r->next = p;
		    r = p;
		}
	}
	if(hb == NULL){
		while(ha != NULL){
			p = (struct node*)malloc(sizeof(struct node));
			p->Exponent = ha->Exponent;
			p->Coefficient = ha->Coefficient;
			ha = ha->next;
			r->next = p;
		    r = p;
		}
	}

	r->next = NULL;
	return c;
}


LinkList mul_List(LinkList a, LinkList b)
{
	Position ha, hb;
	LinkList c,tempC,r,p;
	ha = a->next;
    hb = b->next;
	//c = (struct node*)malloc(sizeof(struct node));
	//c->next = NULL;
    c = creatList(0);
	if(ha == NULL || hb == NULL){
        return c;
	}

	while(ha != NULL ){
        tempC = (struct node*)malloc(sizeof(struct node));
        r = tempC;
        hb = b->next;
        while(hb != NULL){
            p = (struct node*)malloc(sizeof(struct node));
            p->Exponent = ha->Exponent + hb->Exponent;
            p->Coefficient = ha->Coefficient*hb->Coefficient;
			hb = hb->next;
            r->next = p;
            r = p;
        }
        r->next = NULL;
        c = add_List(c,tempC);  //?????为什么不行?结果总是第一次加后的结果

//        tempHead = tempC->next;
//        tempC->next = NULL;
//        while(tempHead != NULL){
//            free(tempHead);
//            tempHead = tempHead->next;
//        }
        ha = ha->next;
	}
	return c;

}
void printList(LinkList L)
{
	LinkList hc;
	int flag = 0;

	hc = L->next;
	if(hc == NULL)
		printf("0 0");
	while(hc != NULL){
		if(flag)
			printf(" ");
		else
			flag = 1;
		printf("%d %d",hc->Coefficient,hc->Exponent);
		hc = hc->next;
	}
}

int main(void)
{
    int n1,n2;
	LinkList L1,L2,L3,L4;

    scanf("%d",&n1);
	L1 = creatList(n1);
	scanf("%d",&n2);
	L2 = creatList(n2);

	L3 = add_List(L1,L2);
    L4 = mul_List(L1,L2);
	printList(L4);
	printf("\n");
	printList(L3);

	return 0;
}









多项式的加减法以及乘法的C语言实现

#include #include "polyn.h" void main() { Node *polyn1; Node head1; Node *polyn2; Node head2; ...
  • meiyubaihe
  • meiyubaihe
  • 2014年05月25日 16:30
  • 3348

PAT 一元多项式的乘法与加法运算(链表 c++版)

题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。 用链表实现一元多项式的乘法与加法运算。 首先来看加法运算 多项式 poly1   x^4 +...
  • chaiwenjun000
  • chaiwenjun000
  • 2015年09月09日 22:45
  • 3517

5-2 一元多项式的乘法与加法运算 (20分)

5-2 一元多项式的乘法与加法运算 (20分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和...
  • Changxing898
  • Changxing898
  • 2016年08月26日 07:44
  • 3035

数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算

02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数...
  • cs_hmyy
  • cs_hmyy
  • 2015年09月30日 19:19
  • 863

02-线性结构1 一元多项式的乘法与加法运算

#include #include typedef struct node{ int coefficient; int exponent; struct node * next; } P...
  • asunamashiro
  • asunamashiro
  • 2015年09月17日 15:00
  • 3783

中国大学MOOC-陈越、何钦铭-数据结构 一元多项式的乘法与加法运算

哈哈哈,写出了困扰自己一个多星期的题目,心情真是好的不得了.顿时,自己内心生出了一种自豪感,这种解决了”难题”的感觉真是太美妙了. 回到题目来: 题目内容: 设计函数分别求两个一元多项式的乘积与...
  • qq_23849183
  • qq_23849183
  • 2015年09月27日 23:42
  • 649

5-2 一元多项式的乘法与加法运算 (20分)

5-2 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多...
  • qq_26437925
  • qq_26437925
  • 2015年10月10日 10:33
  • 1113

PTA--一元多项式的乘法与加法运算

这个问题耗时90分钟才搞定,其中主要的逻辑用时30分钟,调输出格式用时60分钟。。。 我想起来这是我为什么很抵触去写OJ题,很多情况下是你想明白了问题的解法,但是在最后的格式输出上不能完全匹配,便被...
  • u011240016
  • u011240016
  • 2016年10月04日 19:46
  • 1000

c++一元多项式的乘法和加法

首先是结点类:Term.h代码如下:#ifndef CH_H #define CH_H #include #include #include #include using namespace s...
  • tianjun2012
  • tianjun2012
  • 2014年03月26日 20:28
  • 1173

一元多项式相加相乘实现(数据结构)

  • 2010年05月21日 22:54
  • 93KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PAT 3-04 一元多项式的乘法与加法运算(C语言实现)
举报原因:
原因补充:

(最多只允许输入30个字)