摘要:應(yīng)直接使用原序列中的結(jié)點(diǎn),返回歸并后的帶頭結(jié)點(diǎn)的鏈表頭指針。要求分別計(jì)算兩個多項(xiàng)式的乘積與和,輸出第一項(xiàng)為乘積的系數(shù)和指數(shù),第二行為和的系數(shù)和指數(shù)。選定了表示方法后,考慮數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。選擇鏈表在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的時候有系數(shù)指數(shù)和指針結(jié)構(gòu)指針。
函數(shù)題給出編譯器為 C(gcc) 的解答,編程題給出編譯器 C++(g++) 或 Python(python3) 的解答。
函數(shù)接口定義:
List Merge( List L1, List L2 );
其中List結(jié)構(gòu)定義如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存儲結(jié)點(diǎn)數(shù)據(jù) */ PtrToNode Next; /* 指向下一個結(jié)點(diǎn)的指針 */ }; typedef PtrToNode List; /* 定義單鏈表類型 */
L1和L2是給定的帶頭結(jié)點(diǎn)的單鏈表,其結(jié)點(diǎn)存儲的數(shù)據(jù)是遞增有序的;函數(shù)Merge要將L1和L2合并為一個非遞減的整數(shù)序列。應(yīng)直接使用原序列中的結(jié)點(diǎn),返回歸并后的帶頭結(jié)點(diǎn)的鏈表頭指針。
裁判測試程序樣例:
#include#include typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 細(xì)節(jié)在此不表 */ void Print( List L ); /* 細(xì)節(jié)在此不表;空鏈表將輸出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } /* 你的代碼將被嵌在這里 */
輸入樣例:
3 1 3 5 5 2 4 6 8 10
輸出樣例:
1 2 3 4 5 6 8 10 NULL NULL解讀題目
題目中有兩句話:
1、L1和L2是給定的帶頭結(jié)點(diǎn)的單鏈表,其結(jié)點(diǎn)存儲的數(shù)據(jù)是遞增有序的;函數(shù)Merge要將L1和L2合并為一個非遞減的整數(shù)序列。
這里也說明了我們只需要寫一個函數(shù)Merge。實(shí)現(xiàn)思路為比較鏈表 L1 和 L2,然后以非遞減的形式輸出到一個新鏈表 L 上,最后返回鏈表 L。
2、應(yīng)直接使用原序列中的結(jié)點(diǎn),返回歸并后的帶頭結(jié)點(diǎn)的鏈表頭指針。
第二句話中的“直接使用原序列中的結(jié)點(diǎn)”其實(shí)是要求我們把原鏈表上的結(jié)點(diǎn)一個一個摘下來,掛到新鏈表上。實(shí)現(xiàn)代碼
List Merge( List L1, List L2 ){ List p1, p2, p3, L; // 用malloc函數(shù)申請結(jié)構(gòu) L = (List)malloc(sizeof(struct Node)); p1 = L1->Next; p2 = L2->Next; p3 = L; // 通過循環(huán)來遍歷一遍,比較L1和L2,將值小的依次加到p3 // 循環(huán)條件為 P1!=NULL && p2!=NULL while(p1 && p2){ if(p1->Data <= p2->Data){ //把結(jié)果拷貝過去 p3->Next = p1; p3 = p1; // p1指針向后移一位 p1 = p1->Next; }else{ p3->Next = p2; p3 = p2; p2 = p2->Next; } } //將未處理完的另一個鏈表的結(jié)點(diǎn)復(fù)制過去 p3->Next = p1? p1 : p2; L1->Next = NULL; L2->Next = NULL; return L; }提交結(jié)果 編程題 一元多項(xiàng)式的乘法與加法運(yùn)算 題目
設(shè)計(jì)函數(shù)分別求兩個一元多項(xiàng)式的乘積與和。
輸入格式:
輸入分2行,每行分別先給出多項(xiàng)式非零項(xiàng)的個數(shù),再以指數(shù)遞降方式輸入一個多項(xiàng)式非零項(xiàng)系數(shù)和指數(shù)(絕對值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。
輸出格式:
輸出分2行,分別以指數(shù)遞降方式輸出乘積多項(xiàng)式以及和多項(xiàng)式非零項(xiàng)的系數(shù)和指數(shù)。數(shù)字間以空格分隔,但結(jié)尾不能有多余空格。零多項(xiàng)式應(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解讀題目
首先我們看輸入樣例,其實(shí)表示了兩個多項(xiàng)式。第一個多項(xiàng)式非零項(xiàng)有 4 項(xiàng):$3x^4-5x^2+6x-2$,第二哥多項(xiàng)式非零項(xiàng)有 3 項(xiàng):$5x^{20}-7x^4+3x$。
要求分別計(jì)算兩個多項(xiàng)式的乘積與和,輸出第一項(xiàng)為乘積的系數(shù)和指數(shù),第二行為和的系數(shù)和指數(shù)。
求解思路從以下幾個方面考慮:
多項(xiàng)式表示
表示多項(xiàng)式的關(guān)鍵信息,即非零項(xiàng)。有兩種表示方法:數(shù)組和鏈表。根據(jù)它們二者的特點(diǎn),在這道題里項(xiàng)數(shù)是已知的,有一種比較好的實(shí)現(xiàn)方法叫動態(tài)數(shù)組。
選定了表示方法后,考慮數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。
選擇鏈表在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的時候有系數(shù)、指數(shù)、和指針(結(jié)構(gòu)指針)。
程序框架
程序框架搭建的大致流程如下:
int main(){ 讀入多項(xiàng)式1 讀入多項(xiàng)式2 乘法運(yùn)算并輸出 加法運(yùn)算并輸出 return 0; }
實(shí)現(xiàn)以下四步:
讀一個多項(xiàng)式
兩個多項(xiàng)式相乘
兩個多項(xiàng)式相加
多項(xiàng)式輸出
實(shí)現(xiàn)代碼C++ 版本
#include#include using namespace std; #define Max_Expon 1001 #define Max_Mul_Expon 1000001 int main(int argc, const char * argv[]) { //輸入 vector Polynomial_1(Max_Expon, 0); vector Polynomial_2(Max_Expon, 0); int coef = 0; int expon = 0; int num = 0; cin>>num; for(int i=0; i >coef>>expon; Polynomial_1[expon] = coef; } cin>>num; for (int i=0; i >coef>>expon; Polynomial_2[expon]=coef; } //進(jìn)行計(jì)算 vector Polynomial_Result_Mul(Max_Mul_Expon,0); vector Polynomial_Result_Add(Max_Expon,0); for (int i=0; i =0; i--) { if (Polynomial_Result_Mul[i]!=0) { if (flag_1==0) { flag_1=1; cout< =0; i--) { if(Polynomial_Result_Add[i]!=0) { if(flag_2==0) { flag_2=1; cout< 提交結(jié)果:
Python3 版本
p= {} def mysplit(s, split = " "): l = [] for i in s: if i == split: num = s[ : s.index(i)] if len(num) != 0: l.append(num) s = s[s.index(i)+1 : ] l.append(s) return l # 輸入 for i in range(2): s = input() l = mysplit(s) n = int(l.pop(0)) p[i+1] = {} for j in range(n): p[i+1][int(l[j*2+1])] =int(l[j*2]) # 多項(xiàng)式相乘 p["*"] = {} for i in p[1]: for j in p[2]: if p["*"].get(i+j): p["*"][i+j] += p[1][i] * p[2][j] else: p["*"][i+j] = p[1][i] * p[2][j] # 多項(xiàng)式相加 p["+"] ={} p["+"] = p[1] for j in p[2]: if p["+"].get(j): p["+"][j] += p[2][j] else: p["+"][j] = p[2][j] # 處理多項(xiàng)式為空的情況 def zero(p): for i in p: if p[i] != 0: return p.clear() p[0] = 0 zero(p["*"]) zero(p["+"]) # 輸出 def pprint(p): for i in sorted(p, reverse = True): e = " " if(i == sorted(p, reverse = True)[-1]): e = "" print(p[i], i, end = e) pprint(p["*"]) print("") pprint(p["+"])提交結(jié)果
參考鏈接:
視頻編程作業(yè)-兩個有序列表的合并
兩個有序鏈表序列的合并(15 分)
02-線性結(jié)構(gòu)1 一元多項(xiàng)式的乘法與加法運(yùn)算 (20分)
一元多項(xiàng)式的乘法與加法運(yùn)算(20 分)
數(shù)據(jù)結(jié)構(gòu)2.1-一元多項(xiàng)式的乘法與加法運(yùn)算不足之處,歡迎指正。
$$$$
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42626.html
摘要:然而,一棵給定的二叉搜索樹卻可以由多種不同的插入序列得到。輸出格式對每一組需要檢查的序列,如果其生成的二叉搜索樹跟對應(yīng)的初始序列生成的一樣,輸出,否則輸出。 本篇為關(guān)于樹的編程題,給出編譯器 C++(g++)的解答。主要記錄題意理解和代碼學(xué)習(xí)過程。 1 樹的同構(gòu) 題目 給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是同構(gòu)的。例如圖1給出的兩棵樹就是...
摘要:主頁暫時下線社區(qū)暫時下線知識庫自媒體平臺微博知乎簡書博客園我們不是的官方組織機(jī)構(gòu)團(tuán)體,只是技術(shù)棧以及的愛好者合作侵權(quán),請聯(lián)系請抄送一份到基礎(chǔ)編程思想和大數(shù)據(jù)中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔區(qū)塊 【主頁】 apachecn.org 【Github】@ApacheCN 暫時下線: 社區(qū) 暫時下線: cwiki 知識庫 自媒體平臺 ...
摘要:主頁暫時下線社區(qū)暫時下線知識庫自媒體平臺微博知乎簡書博客園我們不是的官方組織機(jī)構(gòu)團(tuán)體,只是技術(shù)棧以及的愛好者合作侵權(quán),請聯(lián)系請抄送一份到基礎(chǔ)編程思想和大數(shù)據(jù)中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文文檔中文 【主頁】 apachecn.org 【Github】@ApacheCN 暫時下線: 社區(qū) 暫時下線: cwiki 知識庫 自媒體平臺 ...
閱讀 2449·2021-10-08 10:17
閱讀 1824·2021-09-06 15:02
閱讀 2539·2019-08-29 17:30
閱讀 2663·2019-08-29 13:24
閱讀 1522·2019-08-29 11:12
閱讀 3337·2019-08-28 17:52
閱讀 666·2019-08-26 11:30
閱讀 3577·2019-08-26 11:01