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 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 "iostream"
using namespace std;
typedef struct Node *ptrToNode;
struct Node {
    int exp;
    float coef;
    ptrToNode next;
};
typedef ptrToNode List;
void count(List l) {
    int k = 0;
    while (l) {
        k++;
        l = l->next;
    }
    cout << k << " ";
}
/* 打印链表中的所有元素
*/
void dispList(List p) {
    int flag = 0;
    if (p == NULL)
        cout << "0 0";
    else {
        while (p) {
            if (flag == 0)
                printf("%d %.1f", p->exp, p->coef);
            else
                printf(" %d %.1f", p->exp, p->coef);
            p = p->next;
            flag++;
        }
    }
    cout << endl;
}
/* 将节点添加到链表尾端
*/
void attach(float coef, int exp, List *rear) {
    List p = (List)malloc(sizeof(Node));
    p->coef = coef;
    p->exp = exp;
    p->next = NULL;
    (*rear)->next = p;
    *rear = p;
}
/* 读入多项式
*/
List readPoly() {
    int n, exp;  // coef指数  exp系数
    float coef;
    List rear;
    cin >> n;
    List p = (List)malloc(sizeof(Node));
    p->next = NULL;
    rear = p; // 指向链表的末尾节点
    while (n--) {
        cin >> exp >> coef;
        attach(coef, exp, &rear);  //将指数,系数作为节点插入链表中
    }
    List t;
    t = p;
    p = p->next;
    free(t);
    return p;
}
/* 比较指数的大小
*/
int compare(int exp1, int exp2) {
    if (exp1 > exp2) {
        return 1;
    }
    else if (exp1 == exp2) {
        return 0;
    }
    else {
        return -1;
    }
}
/* 实现多项式的相加操作
*/

List addPoly(List l1, List l2) {
    List front, rear;
    rear = (List)malloc(sizeof(Node));  // 创建空的头结点
    front = rear;
    // 2个多项式的系数进行比较,如果相等 判断系数和是否为0 不为0 就插入
    while (l1 && l2) {
        int flag = compare(l1->exp, l2->exp);
        if (flag == 1) {
            attach(l1->coef, l1->exp, &rear);
            l1 = l1->next;
        }
        /* 系数相等 */
        else if (flag == 0) {
            if (l1->coef + l2->coef != 0) {
                attach(l1->coef + l2->coef, l1->exp, &rear);
            }
            l1 = l1->next;
            l2 = l2->next;
        }
        else if (flag == -1) {
            attach(l2->coef, l2->exp, &rear);
            l2 = l2->next;
        }
    }
    for (; l1; l1 = l1->next) { attach(l1->coef, l1->exp, &rear);  }
    for (; l2; l2 = l2->next) { attach(l2->coef, l2->exp, &rear);  }
    rear->next = NULL;
    List s = front;
    front = front->next;
    free(s);
    return front;
}
/* 用L1的单元项 * l2的所有项 得到一个新链表
*/
List multiOneItem(List l1, List l2) {
    List rear, p;
    rear = p = (List)malloc(sizeof(Node));
    while (l2) {
        List p = (List)malloc(sizeof(Node));
        p->coef = l1->coef * l2->coef;
        p->exp = l1->exp + l2->exp;
        rear->next = p;
        rear = rear->next;
        l2 = l2->next;
    }
    rear->next = NULL;
    p = p->next;
    return p;
}
/* 用mutiOneItem得到的新链表和之前的链表相加
*/
List multiPoly(List l1, List l2) {
    List q = l1;
    List s = NULL;
    while (q) { //
        s = addPoly(s, multiOneItem(q, l2));
        q = q->next;
    }
    return s;
}
int  main() {
    List l1 = readPoly();  //读入一个多项式
    List l2 = readPoly();  //读入一个多项式
    List p1 = multiPoly(l1, l2); //多项式相乘
    count(p1);
    dispList(p1);
    return 0;
}

 

posted on 2017-01-13 16:41  于无声出听惊雷  阅读(92)  评论(0编辑  收藏  举报

导航