1. 程式人生 > >1002. A+B for Polynomials

1002. A+B for Polynomials

PS:這道題上週日就寫好了,但是忘了發上來。

題解

題目是把兩個多項式相加再按格式輸出,我用的方法是用一個結構體陣列儲存指數和係數,其實就是一個順序連結串列。

這道題因為之前在陳越姥姥的資料結構課做過類似的,所以做起來思路很清晰。不過還是卡了一會兒,甚至找了別人的程式碼看。最終發現自己的思路有以下缺陷:

  1. 沒有按格式輸出。我想測試點裡肯定有係數為整數的,一直沒注意到,題目要求也沒說得那麼清楚,所以忽略了;
  2. 沒有考慮係數相加為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。題目簡單,就不分析他的題解了,附上鍊接。

http://blog.csdn.net/apie_czx/article/details/45309943