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

在PTA上刷DS的題目,有些問題和細節(jié),放上來和大家分享和討論

設(shè)計函數(shù)分別求兩個一元多項式的乘積與和绷耍。

輸入格式:

輸入分2行,每行分別先給出多項式非零項的個數(shù)鲜侥,再以指數(shù)遞降方式輸入一個多項式非零項系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù))褂始。數(shù)字間以空格分隔。

輸出格式:

輸出分2行描函,分別以指數(shù)遞降方式輸出乘積多項式以及和多項式非零項的系數(shù)和指數(shù)崎苗。數(shù)字間以空格分隔,但結(jié)尾不能有多余空格舀寓。零多項式應(yīng)輸出0 0胆数。

輸入樣例:

4 3 4 -5 2  6 1  -2 0
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

解答

  提交時間  |  狀態(tài)  |  分數(shù)    |       題目編譯器      |   耗時     |    用戶
2017/10/15 22:52:56 |  答案正確  |  20  |  C (gcc)    |   2 ms     |    王小C
測試點            提示                結(jié)果      耗時      內(nèi)存
0           sample換個數(shù)字          答案正確    2 ms     128KB
1          同類項合并時有抵消        答案正確    2 ms     256KB
2   系數(shù)和指數(shù)取上限,結(jié)果有零多項式  答案正確    2 ms     128KB
3      輸入有零多項式和常數(shù)多項式     答案正確    2 ms     128KB
#include <stdio.h>
#include <stdlib.h>
#ifndef NULL
#define NULL 0
#endif // NULL

typedef struct node *PtrToNode;
struct node
{
    int coef;
    int expon;
    struct node *Next;
};
typedef PtrToNode List;

List createpoly();//create polynomial according to the data from console
List multpoly(List,List);//multiple of two polynomials
void printpoly(List P);//print out a polynomial
List Addpoly(List,List);//the sum up of two polynomial
void Attach(int,int,List *P);//attach a new node to the polynomial
void InsertPoly(int,int,List PP);//insert a new node into a polynomial

int main()
{
    List P1,P2,PP,PS;
    P1 = createpoly();
    P2 = createpoly();
    PP = multpoly(P1,P2);
    printpoly(PP);
    PS = Addpoly(P1,P2);
    printpoly(PS);

    return 0;
}
List createpoly()
{
    List P,ptr,*rear=NULL;
    int c,e;
    int N;
    P = (List)malloc(sizeof(struct node));
    P->Next = NULL;
    ptr = P;
    rear = &ptr;
    scanf("%d",&N);
    while(N--)
    {
        scanf(" %d %d",&c,&e);
        Attach(c,e,rear); //不確定這里用的應(yīng)該是指針還是prt
    }
    ptr = P;
    P = P->Next;
    free(ptr);
    return(P);
}
void Attach(int c,int e,List *prear)
{
    List P;
    P = (List)malloc(sizeof(struct node ));
    P->coef = c;
    P->expon = e;
    P->Next = NULL;
    (*prear)->Next = P;
    *prear = P;
}
List Addpoly(List P1,List P2)
{
    List PP,ptr,t1,t2;
    PP = (List)malloc(sizeof(struct node));
    PP->Next = NULL;
    ptr = PP;
    if(!P1&&!P2)
        return NULL;
    t1 = P1;t2 = P2;
    while(t1&&t2)
    {
        if(t1->expon > t2->expon)
        {
            Attach(t1->coef,t1->expon,&ptr);
            t1 = t1->Next;
        }
        else if(t2->expon > t1->expon)
        {
            Attach(t2->coef,t2->expon,&ptr);
            t2 = t2->Next;
        }
        else
        {
            if(t1->coef + t2->coef == 0)
            {
                t1 = t1->Next;
                t2 = t2->Next;
            }
            else{
                Attach(t1->coef+t2->coef,t1->expon,&ptr);
                t1 = t1->Next;
                t2 = t2->Next;
            }
        }
    }
    while(t1)
    {
        Attach(t1->coef,t1->expon,&ptr);
        t1 = t1->Next;
    }
    while(t2)
    {
        Attach(t2->coef,t2->expon,&ptr);
        t2 = t2->Next;
    }
    ptr = PP;
    PP = PP->Next;
    free(ptr);
    return PP;
}
List multpoly(List P1,List P2)
{
    List PP,ptr,*prear=NULL,t1,t2;
    if(P1 == NULL || P2 == NULL)
        return NULL;
    PP = (List)malloc(sizeof(struct node));
    PP->Next = NULL;
    ptr = PP;
    prear = &ptr;
    t1 = P1;t2 = P2;
    while(t2)
    {
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,prear);
        t2 = t2->Next;
    }
    t1 = t1->Next;
    while(t1)
    {
        t2 = P2;
        while(t2)
        {
            InsertPoly(t1->coef*t2->coef,t1->expon+t2->expon,PP->Next);
            t2 = t2->Next;
        }
        t1 = t1->Next;
    }
    ptr = PP;
    PP = PP->Next;
    free(ptr);
    return PP;
}

void InsertPoly(int c,int e,List PP)
{
    List ptr,P,tempP;
    if(PP->expon < e)
    {
        P = (List)malloc(sizeof(struct node));
        P->coef = c;
        P->expon = e;
        P->Next = PP;
        PP = P;
    }
    else
    {
        ptr = PP;
        while(ptr->Next)
        {
            if(ptr->Next->expon > e)
                ptr = ptr->Next;
            else
                break;
        }
        if(ptr->Next == NULL)
        {
            P = (List)malloc(sizeof(struct node));
            P->coef = c;
            P->expon = e;
            P->Next = NULL;
            ptr->Next = P;
        }
        else if(ptr->Next->expon < e)
        {
            P = (List)malloc(sizeof(struct node));
            P->coef = c;
            P->expon = e;
            P->Next = ptr->Next;
            ptr->Next = P;
        }
        else
        {

            ptr->Next->coef += c;
            if(ptr->Next->coef == 0)
            {
                tempP = ptr->Next;
                ptr->Next = tempP->Next;
                free(tempP);
            }
        }
    }

}
void printpoly(List P)
{
    int flag = 0;
    List ptr = P;
    if(!P)
    {
        printf("0 0\n");
        return ;
    }
    while(ptr)
    {
        if(!flag)
        {
            printf("%d %d",ptr->coef,ptr->expon);
            flag = 1;
            ptr = ptr->Next;
        }
        else{
            printf(" %d %d",ptr->coef,ptr->expon);
            ptr = ptr->Next;
        }
    }
    printf("\n");

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末基公,一起剝皮案震驚了整個濱河市幅慌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轰豆,老刑警劉巖胰伍,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酸休,居然都是意外死亡骂租,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門斑司,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渗饮,“玉大人,你說我怎么就攤上這事宿刮』フ荆” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵僵缺,是天一觀的道長胡桃。 經(jīng)常有香客問我,道長磕潮,這世上最難降的妖魔是什么翠胰? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮自脯,結(jié)果婚禮上之景,老公的妹妹穿的比我還像新娘。我一直安慰自己膏潮,他們只是感情好锻狗,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般轻纪。 火紅的嫁衣襯著肌膚如雪脚囊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天桐磁,我揣著相機與錄音,去河邊找鬼讲岁。 笑死我擂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缓艳。 我是一名探鬼主播校摩,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阶淘!你這毒婦竟也來了衙吩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溪窒,失蹤者是張志新(化名)和其女友劉穎坤塞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈蚌,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡摹芙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宛瞄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮禾。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖份汗,靈堂內(nèi)的尸體忽然破棺而出盈电,到底是詐尸還是另有隱情,我是刑警寧澤杯活,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布匆帚,位于F島的核電站,受9級特大地震影響轩猩,放射性物質(zhì)發(fā)生泄漏卷扮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一均践、第九天 我趴在偏房一處隱蔽的房頂上張望晤锹。 院中可真熱鬧,春花似錦彤委、人聲如沸鞭铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽车遂。三九已至封断,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舶担,已是汗流浹背坡疼。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衣陶,地道東北人柄瑰。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像剪况,于是被迫代替她去往敵國和親教沾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容