1009. Product of Polynomials (25)
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 Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample 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; }