国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

線(xiàn)性表(鏈表)-多項(xiàng)式加法

2019-11-11 06:09:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

多項(xiàng)式加法 總時(shí)間限制: 1000ms 內(nèi)存限制: 5000kB 描述 我們經(jīng)常遇到兩多項(xiàng)式相加的情況,在這里,我們就需要用程序來(lái)模擬實(shí)現(xiàn)把兩個(gè)多項(xiàng)式相加到一起。首先,我們會(huì)有兩個(gè)多項(xiàng)式,每個(gè)多項(xiàng)式是獨(dú)立的一行,每個(gè)多項(xiàng)式由系數(shù)、冪數(shù)這樣的多個(gè)整數(shù)對(duì)來(lái)表示。

如多項(xiàng)式2x20- x17+ 5x9- 7x7+ 16x5+ 10x4 + 22x2- 15

對(duì)應(yīng)的表達(dá)式為:2 20 -1 17 5 9 - 7 7 16 5 10 4 22 2 -15 0。

為了標(biāo)記每行多項(xiàng)式的結(jié)束,在表達(dá)式后面加上了一個(gè)冪數(shù)為負(fù)數(shù)的整數(shù)對(duì)。

同時(shí)輸入表達(dá)式的冪數(shù)大小順序是隨機(jī)的。

我們需要做的就是把所給的兩個(gè)多項(xiàng)式加起來(lái)。

輸入 輸入包括多行。 第一行整數(shù)n,表示有多少組的多項(xiàng)式需要求和。(1 < n < 100) 下面為2n行整數(shù),每一行都是一個(gè)多項(xiàng)式的表達(dá)式。表示n組需要相加的多項(xiàng)式。 每行長(zhǎng)度小于300。 輸出 輸出包括n行,每行為1組多項(xiàng)式相加的結(jié)果。 在每一行的輸出結(jié)果中,多項(xiàng)式的每一項(xiàng)用“[x y]”形式的字符串表示,x是該項(xiàng)的系數(shù)、y 是該項(xiàng)的冪數(shù)。要求按照每一項(xiàng)的冪從高到低排列,即先輸出冪數(shù)高的項(xiàng)、再輸出冪數(shù)低的項(xiàng)。 系數(shù)為零的項(xiàng)不要輸出。 樣例輸入 2 -1 17 2 20 5 9 -7 7 10 4 22 2 -15 0 16 5 0 -1 2 19 7 7 3 17 4 4 15 10 -10 5 13 2 -7 0 8 -8 -1 17 2 23 22 2 6 8 -4 7 -18 0 1 5 21 4 0 -1 12 7 -7 5 3 17 23 4 15 10 -10 5 13 5 2 19 9 -7 樣例輸出 [ 2 20 ] [ 2 19 ] [ 2 17 ] [ 15 10 ] [ 5 9 ] [ 6 5 ] [ 14 4 ] [ 35 2 ] [ -22 0 ] [ 2 23 ] [ 2 19 ] [ 2 17 ] [ 15 10 ] [ 6 8 ] [ 8 7 ] [ -3 5 ] [ 44 4 ] [ 22 2 ] [ -18 0 ] 提示 第一組樣例數(shù)據(jù)的第二行末尾的8 -8,因?yàn)閮绱?8為負(fù)數(shù),所以這一行數(shù)據(jù)結(jié)束,8 -8不要參與計(jì)算。

初看這道題,便直接想到了使用下標(biāo)作為指數(shù),用一個(gè)數(shù)組來(lái)存放對(duì)應(yīng)的系數(shù)。但是題目中并沒(méi)有提到最大的指數(shù)是多少,所以我默認(rèn)地開(kāi)了個(gè)長(zhǎng)度為10000的數(shù)組,很可惜,直接得了個(gè)6分的RE,明顯是數(shù)據(jù)不夠放。其實(shí)本來(lái)這道題就是叫你不用數(shù)組來(lái)做嘛:內(nèi)存限制都比平時(shí)的題少了一點(diǎn)!

于是想到了使用鏈表來(lái)存儲(chǔ)數(shù)據(jù),一是不用存進(jìn)一大片0,二是不受指數(shù)的最大值限制。但問(wèn)題又來(lái)了,題目要求最后按指數(shù)從大到小輸出,究竟怎么做才又快又準(zhǔn)呢?具體方法與技巧見(jiàn)代碼。

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <cctype>#include <iostream>using namespace std;struct Node{ int num; int exp; Node *PRe; Node *next;}*head,*cnt;int main(){ int a; scanf("%d",&a); while(a--) { head=(Node*)calloc(1,sizeof(Node)); //1.使用calloc而不是malloc,相當(dāng)于malloc+memset,無(wú)需再初始化 head->exp=0x7FFFFFFF; //2.signed int (32位) 的最大值為0x7FFFFFFF int input[2]; for(int i=0; i<2; i++) { while(~scanf("%d%d",&input[0],&input[1]) && input[1]>=0) //3.輸入個(gè)數(shù)不限的數(shù)據(jù)的處理方法 { cnt = head; //為了讓最后的輸出方便,我采用了從大到小的順序排列, //這才有了之前的頭結(jié)點(diǎn)的最大值 //對(duì)于一個(gè)新的指數(shù),確定位置后cnt停留在大于它且最接近它的結(jié)點(diǎn)上 //如指數(shù)為...8 5...,新指數(shù)為6,則cnt停留在8上 //對(duì)于一個(gè)已有的指數(shù),cnt就停留在相同指數(shù)的結(jié)點(diǎn)上 while(cnt->next && cnt->exp>input[1] && cnt->next->exp>=input[1]) //確定插入的位置 { cnt=cnt->next; } if(input[1]==cnt->exp) //相等就加 { cnt->num+=input[0]; } else { //因?yàn)橐獦?gòu)建一個(gè)有序的鏈表,所以不是都在尾部插入結(jié)點(diǎn), //在中間插入結(jié)點(diǎn)要復(fù)雜一點(diǎn),分情況討論 if(cnt->next) { Node *temp=cnt->next; cnt->next=(Node*)calloc(1,sizeof(Node)); cnt->next->pre=cnt; cnt->next->next=temp; temp->pre=cnt->next; } else //尾部插入 { cnt->next=(Node*)calloc(1,sizeof(Node)); cnt->next->pre=cnt; } cnt=cnt->next; cnt->exp=input[1]; cnt->num+=input[0]; } } } cnt=head; while(cnt->next) { if(cnt->next->num) printf("[ %d %d ] ",cnt->next->num,cnt->next->exp); cnt=cnt->next; free(cnt->pre); //4.配合頭結(jié)點(diǎn)進(jìn)行free操作,保證沒(méi)有內(nèi)存泄漏 } free(cnt); //(接4)僅需在最后多free一次,無(wú)須單獨(dú)處理指針 printf("/n"); } return 0;}

雖然看上去鏈表的處理很復(fù)雜,但實(shí)際上十分有效,使用這樣的思路就直接AC了。

還有一點(diǎn)要注意:盡量避免exp這樣的變量名,因?yàn)闀?huì)與庫(kù)函數(shù)重名!要不是本代碼中這是一個(gè)成員變量,他會(huì)直接CE!


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遂昌县| 永春县| 鹤壁市| 万年县| 桐城市| 清镇市| 虹口区| 南皮县| 霞浦县| 巫山县| 泸溪县| 裕民县| 余江县| 德格县| 阿鲁科尔沁旗| 柯坪县| 绥江县| 贡觉县| 泸溪县| 连山| 沙田区| 龙州县| 任丘市| 金塔县| 永泰县| 邻水| 福建省| 天等县| 吴川市| 开远市| 呼图壁县| 桦南县| 巴马| 合肥市| 珲春市| 富阳市| 离岛区| 马公市| 铜陵市| 辽源市| 通辽市|