當前位置:
首頁 >
2.2 多项式乘法与加法运算(线性结构,C)
發布時間:2024/5/8
44
豆豆
生活随笔
收集整理的這篇文章主要介紹了
2.2 多项式乘法与加法运算(线性结构,C)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多項式乘法與加法運算
- 設計函數分別求兩個一元多項式的乘積與和
- 題意理解
- 題意理解
- 和
- 積
- 求解思路
- 多項式表示
- 兩種表示方式
- 在事先已經知道具體多少項的時候,本題較好的實現方法:==動態數組==
- 鏈表表示多項式的方法
- 程序框架
- 如何讀入多項式
- 讀入多項式的完整程序
- 加法實現
- 乘法實現
- 把P1的第一項乘以P2的每一項
- 把當前兩項乘積的結構如何插進去
- 多項式輸出
- 多項式乘法與加法運算實現源碼
- 運行
設計函數分別求兩個一元多項式的乘積與和
原題直達:02-線性結構2 一元多項式的乘法與加法運算
設計函數分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項系數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。
輸出格式:
輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的系數和指數。數字間以空格分隔,但結尾不能有多余空格。零多項式應輸出0 0。
題意理解
- 第一列的4和3分別代表兩個多項式的項數,第一個總共四項,第二個總共三項
- 第一行代表第一個多項式的項數,總共有四項,把這四項的系數指數按順序列出來,比如3 4就是3x的4次方 ,-5 2就是-5x的平方
題意理解
- 第一行輸出為乘積結果,按系數,指數這樣的順序輸出
- 第二行輸出為兩個多項式相加的結果
由題意已知兩個多項式
(1)3x4-5x2+6x-2
(2)5x20-7x4+3x
和
- 指數相同的項,系數相加減,同類項合并
積
- (a+b)(c+d)=ac+ad+bc+bd,兩項相乘,系數相乘,指數相加,依次相乘得出結果后,合并同類項
求解思路
多項式表示
線性序列,僅表示非零項的指數,系數,一對一對的表現出來
兩種表示方式
- 數組:需要事先確定數組的大小
- 鏈表:動態性比較強,編的程序比較復雜,涉及到指針,調試困難
在事先已經知道具體多少項的時候,本題較好的實現方法:動態數組
- 如,已知有四項,就通過空間申請malloc,申請四個結構的這樣的一個數組,然后把四個信息放到結構數組里面去
鏈表表示多項式的方法
程序框架
如何讀入多項式
- 第一個整數代表有多少項,接下來是一對一對的系數指數這些項
- 先讀入N,接下來做四輪的循環,每輪循環讀入一對數(系數、指數),分別放到c和e里邊去,讀進來之后,構造一個結點,把這個結點插到多項式里面去,讀的過程是從指數遞降的順序來進行讀的,所以讀入一個新結點的時候,應該插在前面一個結點的后面,最后形成P1所指向的鏈表
讀入是從左到右讀入的,先讀的是指數高的這一項,插到鏈表里面去,接下來再讀對數,再插進去,再構造一個新結點,再查到前面去,因為是指數遞降的順序,所以在鏈表里也是指數遞降的,應該插到原來結果的后面,所以需要一個指針Rear,指向當前結果多項式的最后一項,是新結點能插到后面,通過函數Attach完成
插入新結點之后,Rear值也要更改,指向最新結點上面去,所以傳進Rear的參數必須是指針,保證能被改變
- 為NULL時,說明是剛開始的第一個結點,需要申請這個結點,然后把Rear指向這個結點
- 不為NULL時,直接把新結點插到Rear的后面
- 一開始指向一個空結點,讓Rear指向這個空結點,以后所有新插入結點全插入到Rear后面,在Attach函數中就不需要判別Rear是不是空了。
- 利用臨時申請一個空結點的方法,使得程序的處理起來一致性比較強,代碼簡單。最后注意把空結點刪掉。
這里傳進來的是Polynomial這個類型的指針,Polynomial本身也是指針,所以pRear是指針的指針,C語言是函數常數值傳遞
- 再把P賦值給(*pRear)->link這個指針就指過去了
再把P賦值給*pRear
讀入多項式的完整程序
加法實現
- 比較當前t1,t2所指向的指數是否相等,相等的話,系數就相加,等于0就不管了,不等于就把新的系數指數加到Rear后面。
- 如果t1,t2所指向的指數不相等,就把大的拷貝到Rear后面
乘法實現
逐項插入代碼如下
還存在3個問題
- 怎么構造初始的多項式,就是把P1的第一項乘以P2的每一項
- 把當前兩項乘積的結構如何插進去
- 結果怎么處理
把P1的第一項乘以P2的每一項
把當前兩項乘積的結構如何插進去
- 結果怎么處理
多項式輸出
- 基本框架
- 詳細函數
多項式乘法與加法運算實現源碼
#include <stdio.h> #include <stdlib.h>typedef int ElementType; /* ElementType類型根據實際情況而定,這里假設為int */typedef struct PolyNode *Polynomial; struct PolyNode { /* 隊列中的結點結構 */ ElementType coef; //系數ElementType expon; //指數Polynomial link; //指向下一個結點的指針 };int Compare(int a,int b) {if (a > b) return(1);if (a < b)return(-1);else return(0); }/*將傳入值加到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 = NULL;(*pRear)->link = P;/*把新申請的結點P插到rear的后面*/*pRear = P; /*修改pRear值*/ }/*讀入多項式*/ Polynomial ReadPoly() {Polynomial P, Rear, t;int c, e, N;//printf("請輸入第一位數N(共幾項),后面為項目的系數指數,空格隔開\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; }/*兩個多項式相加*/ Polynomial PolyAdd(Polynomial P1, Polynomial P2) {Polynomial front, rear, temp; /*兩個指針front和rear分別指向結果多項式的頭和尾*/int sum;rear = (Polynomial)malloc(sizeof(struct PolyNode));/*申請一個空間,front和rear都指向它*/front = rear; /*由front記錄結果多項式鏈表頭結點*/while(P1&&P2) /*當兩個多項式都有非零項待處理時*/switch (Compare(P1->expon, P2->expon)) {case 1: /*P1->expon>P2->expon*/Attach(P1->coef, P1->expon, &rear); /*將P1的當前項存入結果多項式,*/P1 = P1->link; /*并使P1指向下一項*/break;case -1: /*P1->expon<P2->expon*/Attach(P2->coef, P2->expon, &rear); /*將P2的當前項存入結果多項式,*/P2 = P2->link; /*并使P2指向下一項*/break;case 0: /*P1->expon==P2->expon*/sum = P1->coef + P2->coef; /*系數相加,*/if (sum) Attach(sum,P1->expon,&rear); /*若結果不為0,則作為結果多項式對應項的系數。*/P1 = P1->link;P2 = P2->link; /*同時,P1和P2都分別指向下一項*/break;}/*循環結束退出的時候,就是P1或P2里面有一個為空了*//*將未處理完的另一個多項式的所有結點依次復制到結果多項式中去*/for (; P1; P1 = P1->link) Attach(P1->coef,P1->expon,&rear);for (; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear);rear->link = NULL; /*rear指向結果多項式的最后一項,加完之后,最后一項沒了,把link設為NULL*/temp = front;front = front->link; /*令front指向結果多項式第一個非零項*/free(temp); /*釋放臨時空表頭結點*/return front; }/*兩個多項式相乘*/ Polynomial Mult(Polynomial P1, Polynomial P2) {Polynomial P, Rear, t1, t2, t;int c, e;if (!P1||!P2) return NULL;t1 = P1; t2 = P2;P= (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL;Rear = P;while (t2) {/*先用P1的第一項乘以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 = Rear->link; /*如果大,Rear就不斷往后挪*/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); /*將P指向結果多項式第一個非零項*/return P; }void PrintPoly(Polynomial P) {/*輸出多項式*/int flag = 0; /*輔助調整輸出格式用*/if (!P) { printf("0 0\n"); return; }while (P) {if (!flag)flag = 1;elseprintf(" ");printf("%d %d",P->coef,P->expon);P = P->link;}printf("\n"); }int main() {Polynomial P1, P2,PP,PS;P1 = ReadPoly();P2 = ReadPoly();PP = Mult(P1,P2); //乘PrintPoly(PP);PS=PolyAdd(P1, P2);//加PrintPoly(PS);return 0; }運行
//請輸入第一位數N(共幾項),后面為項目的系數指數,空格隔開 4 3 4 -5 2 6 1 -2 0 //請輸入第一位數N(共幾項),后面為項目的系數指數,空格隔開 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 多项式乘法与加法运算(线性结构,C)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 降雨模拟器
- 下一篇: 回顾我第一次接触编程