1. 程式人生 > 其它 >一元多項式加法與乘法

一元多項式加法與乘法

一元多項式的加法與乘法運算

題意理解

設計函式分別求兩個一元多項式的乘積與和

求解思路

  1. 多項式表示
  2. 程式框架
  3. 讀多項式
  4. 加法實現
  5. 乘法實現
  6. 多項式輸出

多項式的表示

僅表示非零項

  • 陣列

    • 程式設計簡單、除錯容易
    • 需要事先確定陣列大小

    一種比較好的實現方法是:動態陣列

  • 連結串列

    • 動態性強
    • 程式設計略為複雜、除錯比較困難

資料結構設計

typedef struct PolyNode *Polynomial;
struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
};

程式框架搭建

int main(){
    讀入多項式1
    讀入多項式2
    乘法運算並輸出
    加法運算並輸出
    return 0;
}
int main(){
    Polynomial P1, P2, PP, PS;
    
    P1 = ReadPoly();
    P2 = ReadPoly();
    PP = Mult(P1, P2);
    PrintPoly(PP);
    PS = Add(P1, P2);
    PrintPoly(PS);
}

需要設計的函式:

  • 讀取一個多項式
  • 兩多項式相乘
  • 兩多項式相加
  • 多項式輸出

如果讀入多項式

Polynomial ReadPoly(){
    Polynomial P, Rear, t;
    int c, e, N;
    scanf("%d", &N);
   	P = (Polynomial)malloc(sizeof(struct PolyNode));//連結串列頭空結點
    P->link = NULL;
    Rear = P;
    while (N--){
        scanf("%d%d",&c, &e);
        Attach(c, e, &Rear);//將當前項插入多項式尾部
    }
    t = P;
    P = P->link;
    free(t);//刪除臨時生成的頭結點
    return P;
}

Rear初值是多少?

兩種處理方法:

  1. Rear初值為NULL

    在Attach函式中根據Rear是否為NULL做不同處理

  2. Rear指向一個空姐點

void Attach(int c, int e, Polynomial *pRear){
    Polynomial P;
    
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;//對新結點賦值
    P->expon = e;
    P->link = P;
    *pRear = P;//修改*pRear值
}

如何將兩個多項式相加

Polynomial Add(Polynomial P1, Polynomial P2){
    t1 = P1;
    t2 = P2;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    Rear = P;
    while (t1 && t2){
        if (t1->expon == t2->expon){
            
        }
        else if (t1->expon > t2->expon){
            
        }
        else{
            
        }
        while (t1){
            
        }
        while (t2){
            
        }
    }
    return P;
}

如何將兩個多項式相乘

方法:

  1. 將乘法運算轉換為加法運算

​ 將P1當前項(ci,ei)乘P2多項式,再加到結果多項式裡

t1 = P1;
t2 = P2;
P  = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2){
    Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
    t2 = t2->link;
}
  1. 逐項插入

​ 將P1當前項(c1i, e1i)乘P2當前項(c2i, e2i),並插入到結果中。並插入到結果中。關鍵是要找到插入位置

​ 初始結果多項式可由P1第一項乘P2獲得

Polynomial Mult(Polynomial P1, Polynomial P2){
    Polynomial P, Rear, t1, t2, t;
    int c, e;
    if (!P1||!P2) return NULL;
    t1 = P1;
    t2 = P2;
    while(t2){//先用P1的第1項乘以P2,得到P
        Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
        t2 = t2->link;
    }
    t1 = t1->link;
    while (t1){
        t2 = P2;
        Rear = P;
        while (t2){
            e = t1->expon + t2->expon;
            c = t1->coef * t2->coef;
            while (Rear->link && Rear->link->expon > e)
                Rear = Rear->link;
            if (Rear->link && Rear->link->expon == e){
                 if (Rear->link->coef + c)
                     Rear->link->coef+=c;
                else{
                    t = Rear->link;
                    Rear->link = t->link;
                    free(t);
                }
            }
            else{
                t = (Polynomial)malloc(sizeof(struct PolyNode));
                t->coef = c;
                t->expon = e;
                t->link = Rear->link;
                Rear->link = t;
                Rear = Rear->link;
            }
            t2 = t2->link;
        }
        t1 = t1->link;
    }
	t2 = P;P = P->link; free(t2);
}

如何將多項式輸出

void PrintPoly(Polynomial P){
    //輸出多項式
    int flat = 0;
    if(!P){
        printf("0 0\n");return;
    }
    while(P){
        if(!flag)
            flag = 1;
        else
            printf(" ");
    }
    printf("\n");
}