1002. A+B for Polynomials
阿新 • • 發佈:2018-11-26
PS:這道題上週日就寫好了,但是忘了發上來。
題解
題目是把兩個多項式相加再按格式輸出,我用的方法是用一個結構體陣列儲存指數和係數,其實就是一個順序連結串列。
這道題因為之前在陳越姥姥的資料結構課做過類似的,所以做起來思路很清晰。不過還是卡了一會兒,甚至找了別人的程式碼看。最終發現自己的思路有以下缺陷:
- 沒有按格式輸出。我想測試點裡肯定有係數為整數的,一直沒注意到,題目要求也沒說得那麼清楚,所以忽略了;
- 沒有考慮係數相加為0的情況。係數為0後這一項就消失了,這個之前應該有提過但是太不小心了。
附上自己的程式碼和測試情況:
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; struct Node{ int Expon; double Coef; }; typedef struct Node *Poly; int cnt=0; /* 用法不是很規範,但是懶得改了 */ Poly CreatePoly(int Num); Poly BuildPoly(int Num); Poly AddPoly(Poly p1, int k1, Poly p2, int k2); void Print(Poly P); int main() { int k1, k2; Poly Pa, Pb, P; cin>>k1; Pa=BuildPoly(k1); cin>>k2; Pb=BuildPoly(k2); P=AddPoly(Pa, k1, Pb, k2); Print(P); return 0; } Poly CreatePoly(int Num) { Poly P; P=(Poly)malloc(Num*sizeof(struct Node)); return P; } Poly BuildPoly(int Num) { int i; Poly P; P=CreatePoly(Num); for(i=0; i<Num; i++) { cin>>P[i].Expon>>P[i].Coef; } return P; } Poly AddPoly(Poly p1, int k1, Poly p2, int k2) { int i, j, k; Poly P; P=CreatePoly(k1+k2); i=0, j=0, k=0; while(i<k1 && j<k2) { if(p1[i].Expon > p2[j].Expon) { P[k].Expon=p1[i].Expon; P[k].Coef=p1[i].Coef; k++; cnt++; i++; } else if(p1[i].Expon < p2[j].Expon) { P[k].Expon=p2[j].Expon; P[k].Coef=p2[j].Coef; k++; cnt++; j++; } else { if(p1[i].Coef+p2[j].Coef) { P[k].Expon=p1[i].Expon; P[k].Coef=p1[i].Coef+p2[j].Coef; k++; cnt++; } i++; j++; } } if(i==k1) { while(j<k2) { P[k].Expon=p2[j].Expon; P[k].Coef=p2[j].Coef; k++; cnt++; j++; } } if(j==k2) { while(i<k1) { P[k].Expon=p1[i].Expon; P[k].Coef=p1[i].Coef; k++; cnt++; i++; } } if(cnt==0) return NULL; else return P; } void Print(Poly P) { int i; cout<<cnt; if(cnt!=0) { for(i=0; i<cnt; i++) { printf(" %d %.1lf", P[i].Expon, P[i].Coef); // 這個格式卡了8分 } } }
情況基本這樣,然後我再去看了別人的思路,也用的陣列,但是沒有用結構體,也沒有分成幾個函式做,初學者可能看不大懂。記憶體使用大家都差不多大,但是他的時間只有1ms。題目簡單,就不分析他的題解了,附上鍊接。