1009. Product of Polynomials (25)

1009. Product of Polynomials (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

This time, you are supposed to find A*B where A and B are two polynomials.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10, 0 <= NK < ... < N2 < N1 <=1000.

Output Specification:

For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.

Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output
3 3 3.6 2 6.0 1 1.6
 
 
每次暂时的链表记得要释放。
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE *PtrN;

struct NODE
{
	int exp;
	float coe;
	PtrN Next;
};
PtrN ReadP(int N)
{
	
	PtrN head = (PtrN)malloc(sizeof(struct NODE));
	head->Next = NULL;
	head->exp = N;
	int i;
	PtrN P = head;
	for (i = 0; i < N; i++)
	{
		P->Next = (PtrN)malloc(sizeof(struct NODE));
		P = P->Next;
		P->Next = NULL;
		scanf("%d %f", &P->exp, &P->coe);
	}
	return head;


}
PtrN Pro(int exp, float coe, PtrN P2)
{
	PtrN head = (PtrN)malloc(sizeof(struct NODE));
	head->exp = P2->exp;
	head->Next = NULL;
	PtrN PP = head;
	PtrN P = P2->Next;
	while (P != NULL)
	{
		PP->Next = (PtrN)malloc(sizeof(struct NODE));
		PP = PP->Next;
		PP->coe = coe * P->coe;
		PP->exp = exp + P->exp;
		PP->Next = NULL;
		P = P->Next;
	}
	return head;
}
PtrN AddPoly(PtrN P1, PtrN P2)
{
	PtrN head = (PtrN)malloc(sizeof(struct NODE));
	head->Next = NULL;
	head->exp = 0;
	PtrN p1 = P1->Next, p2 = P2->Next,P=head;
	while (p1 != NULL&&p2 != NULL)
	{   
		if (p1->exp == p2->exp&&p1->coe + p2->coe == 0)
		{
			p1 = p1->Next;
			p2 = p2->Next;
			continue;
		}
		P->Next = (PtrN)malloc(sizeof(struct NODE));
		P = P->Next;
		P->Next = NULL;
		if (p1->exp == p2->exp)
		{
			P->coe = p1->coe + p2->coe;
			P->exp = p1->exp;
			p1 = p1->Next;
			p2 = p2->Next;
			head->exp++;
		}
		else if (p1->exp > p2->exp)
		{
			P->coe = p1->coe;
			P->exp = p1->exp;
			p1 = p1->Next;
			head->exp++;
		}
		else
		{
			P->coe = p2->coe;
			P->exp = p2->exp;
			p2 = p2->Next;
			head->exp++;
		}

	}
	while (p1 != NULL)
	{
		P->Next = (PtrN)malloc(sizeof(struct NODE));
		P = P->Next;
		P->Next = NULL;
		P->coe = p1->coe;
		P->exp = p1->exp;
		p1 = p1->Next;
		head->exp++;
	}
	while (p2 != NULL)
	{
		P->Next = (PtrN)malloc(sizeof(struct NODE));
		P = P->Next;
		P->Next = NULL;
		P->coe = p2->coe;
		P->exp = p2->exp;
		p2 = p2->Next;
		head->exp++;
	}
	return head;
}
void FreeLink(PtrN P)
{
	PtrN Last=P,PP;

	if (P->Next == NULL)
		free(P);
	else
	{
		while (Last->Next->Next != NULL)Last = Last->Next;
		PP = Last->Next;
		free(PP);
		Last->Next = NULL;
		FreeLink(P);
	}
	return;
		
}
PtrN ProductP(PtrN P1, PtrN P2)
{
	PtrN head;
	PtrN tmp,P,PP ;
	P = P1->Next;
	head = Pro(P->exp, P->coe, P2);
	P = P->Next;
	while (P != NULL)
	{
		tmp = Pro(P->exp, P->coe, P2);
		PP= AddPoly(head, tmp);
		FreeLink(tmp);
		FreeLink(head);
		head = PP;
		P = P->Next;
	}
	return head;
}
void Print(PtrN head)
{
	int i = 0;
	PtrN P;
	P = head->Next;
	printf("%d", head->exp);
	while (P != NULL)
	{
		printf(" %d %.1f", P->exp, P->coe);
		P = P->Next;
	}
	return;
}
int main()
{
	
	
	int N1, N2;
	int i, j, k;
	PtrN P1, P2;
	scanf("%d", &N1);
	P1= ReadP(N1);
	scanf( "%d", &N2);
        P2 = ReadP(N2);
	PtrN result = ProductP(P1,P2);
	Print(result);
	
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值