數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)長的整數(shù)加法_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)長的整數(shù)加法_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)長的整數(shù)加法_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)長的整數(shù)加法_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)長的整數(shù)加法_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)題目名稱:長的整數(shù)加法 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院一、 需求分析1.問題描述:設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)兩個(gè)任意長的整數(shù)的求和運(yùn)算。2.基本要求:利用雙向循環(huán)鏈表,設(shè)計(jì)一個(gè)實(shí)現(xiàn)任意長的整數(shù)進(jìn)行加法運(yùn)算的演示程序。要求輸入和輸出每四位一組,組間用逗號(hào)隔開。如:1,0000,0000,0000,0000。3.任務(wù)陳述:(a) 輸入的形式和輸入值的范圍:本實(shí)驗(yàn)中演示中,長整數(shù)的每位上的數(shù)字必須為數(shù)字09之間,長整數(shù)的位數(shù)要求無限長。測試的時(shí)候輸入數(shù)據(jù),當(dāng)輸入回車鍵的時(shí)候結(jié)束輸入,如果輸入的字符不符合題目要求,則程序能過濾這些不符合要求的字符。(b) 輸出的形式: 整數(shù)的范圍無限制,可為正數(shù),可為負(fù)數(shù)

2、。按照中國對(duì)于長整數(shù)的表示習(xí)慣,每四位是一組,組間用逗號(hào)隔開。(c) 程序所能達(dá)到的功能: 演示程序以用戶和計(jì)算機(jī)的對(duì)話方式執(zhí)行,即在計(jì)算機(jī)顯示“提示信息”后之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運(yùn)算命令;相應(yīng)的輸入數(shù)據(jù)和運(yùn)算結(jié)果顯示在其后,并對(duì)錯(cuò)誤。(d)測試數(shù)據(jù):為正確輸入數(shù)據(jù),為錯(cuò)誤輸入數(shù)據(jù)(超出4位),為錯(cuò)誤輸入數(shù)據(jù)(不足4位)。兩長整數(shù)a=b=0請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234-按該模式輸入 0 -輸入長整數(shù)a 您的輸入結(jié)果為:0 -顯示a(防止錯(cuò)誤輸入)請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234 -輸入

3、長整數(shù)b您的輸入結(jié)果為:0您的運(yùn)算結(jié)果為:0 -輸出b>a>0請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,12341,1111,1111,1111 您的輸入結(jié)果為:1,1111,1111,1111請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,12349,9999,9999,9999您的輸入結(jié)果為:9,9999,9999,9999您的運(yùn)算結(jié)果為: 11,1111,1111,1110a>b>0請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,12349999,9999,9999您的輸入結(jié)果為:9999,9999

4、,9999請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,12342您的輸入結(jié)果為:2您的運(yùn)算結(jié)果為:1,0000,0000,0001b<a<0請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234 -2345,6789 您的輸入結(jié)果為:-2345,6789請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-7654,3211您的輸入結(jié)果為:-7654,3211您的運(yùn)算結(jié)果為: 1,0000,0000a<0,b>0,|a|>|b| 請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234

5、,1234-1,0000,00001您的輸入結(jié)果為:-1,0000,0001請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,12342您的輸入結(jié)果為:2您的運(yùn)算結(jié)果為:-9999,9999a<0,b>0,|a|<|b|請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234-9999您的輸入結(jié)果為:-9999請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,12341,0000您的輸入結(jié)果為:1,0000您的運(yùn)算結(jié)果為:1a>0,b<0,|a|>|b| 請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -

6、1234,1234,1234 1,0000,0000您的輸入結(jié)果為:1,0000,0000請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-9999您的輸入結(jié)果為:-9999您的運(yùn)算結(jié)果為:9999,0001a>0,b<0,|a|<|b|請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234 1 您的輸入結(jié)果為:1請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-1,0000,0000您的輸入結(jié)果為:-1,0000,0000您的運(yùn)算結(jié)果為:-9999,9999錯(cuò)誤輸入(例:輸入超過四位,則自動(dòng)取其前

7、四位進(jìn)行運(yùn)算)請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,12341,00000您的輸入結(jié)果為:1,0000請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-99998,01234您的輸入結(jié)果為:-9999,1234您的運(yùn)算結(jié)果為:-9998,1234 錯(cuò)誤輸入(例:非第一次輸入少于四位,則在輸入前加0補(bǔ)足四位進(jìn)行運(yùn)算)請按照如下形式輸入第一個(gè)長整數(shù),每四位一組: -1234,1234,1234 1,000 您的輸入結(jié)果為:1,0000請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-1,11您的輸入結(jié)果為:-1,

8、0011您的運(yùn)算結(jié)果為:-11二、概要設(shè)計(jì)1.目標(biāo)需求與設(shè)計(jì)思想通過尾插輸入長整數(shù),為實(shí)現(xiàn)順序存入,并用頭插存儲(chǔ)的運(yùn)算后的長整數(shù),因?yàn)檫\(yùn)算必定從后向前計(jì)算,同樣為了實(shí)現(xiàn)順序存入。因?yàn)槿我獾拈L整數(shù)可能為負(fù)數(shù),則第一步需判斷其符號(hào)。先判斷長整數(shù)a,b的符號(hào)的異同,相同,則將a的符號(hào)存入新的雙向鏈表c的符號(hào)位;相異,則將b的符號(hào)存入c,之后再處理。根據(jù)c的符號(hào)位,使用加法或減法的函數(shù),需要考慮進(jìn)位借位,從后開始進(jìn)行運(yùn)算。通過刪除函數(shù),刪除因借位而出現(xiàn)的多余的0。最后打印運(yùn)算后的c。2數(shù)據(jù)結(jié)構(gòu)此實(shí)驗(yàn)采用的數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表。這樣可以很容易的找到他的前驅(qū)以及它的后繼,并使用它們存儲(chǔ)。這是其結(jié)構(gòu)體聲明

9、:typedef struct DualNode int data; struct DualNode *prior, *next;DualNode, *DualList;2.程序構(gòu)成1)DualList InputData() 操作結(jié)果:初始化一雙向循環(huán)鏈表,完成輸入操作,并將該鏈表返回。2)DualList AddList(DualList a, DualList b) 操作結(jié)果:判斷其符號(hào)3)DualList InitList(int sign) 操作結(jié)果:初始化一雙向循環(huán)鏈表,存儲(chǔ)符號(hào)位,并將該鏈表返回。4)void InsertNodeAtTail(DualList L, int da

10、ta) 操作結(jié)果:尾插,用于存儲(chǔ)數(shù)據(jù)的存入。5)void InsertNodeAtHead(DualList L, int data) 操作結(jié)果:插在頭結(jié)點(diǎn)之后,用于計(jì)算結(jié)果的存儲(chǔ)。6)void Add(DualList a, DualList b, DualList c)操作結(jié)果:加運(yùn)算7)void Sub(DualList a, DualList b, DualList c)操作結(jié)果:減運(yùn)算8)void DelNode(DualList L, DualNode *p)操作結(jié)果:刪除因借位產(chǎn)生的多余的0。9)void PrintList(DualList L)操作結(jié)果:打印鏈表3.流程及調(diào)用

11、關(guān)系主程序模塊 輸入aPrintList()InputData()調(diào)用 輸入bPrintList()InputData()調(diào)用InitList()AddList()調(diào)用Sub()InsertNodeAtHead()Add()調(diào)用調(diào)用 調(diào)用DelNode()PrintList()結(jié)束三、詳細(xì)設(shè)計(jì)1.頭文件定義#include <stdio.h>#include <stdlib.h>#include <ctype.h>2.數(shù)據(jù)結(jié)構(gòu)詳細(xì)設(shè)計(jì)typedef struct DualNode int data; struct DualNode *prior, *next

12、;DualNode, *DualList;雙向循環(huán)鏈表的節(jié)點(diǎn)由三個(gè)部分組成,第一是數(shù)據(jù)部分data存儲(chǔ)此節(jié)點(diǎn)的數(shù)據(jù),第二是此節(jié)點(diǎn)的前驅(qū)指針部分*prior指向此節(jié)點(diǎn)的前驅(qū),第三是此節(jié)點(diǎn)的后繼指針部分*next指向此節(jié)點(diǎn)的后繼。數(shù)據(jù)部分我們約定它為整形變量,前驅(qū)后繼指針均為結(jié)構(gòu)體DualNode類型。3.輸入函數(shù)與初始化函數(shù)設(shè)計(jì)DualList InputData() int FirstNum = 1, data; char c; DualList L; L = (DualList)malloc(sizeof(DualNode); L->next = L->prior = L; pr

13、intf("Please Input as Format: -1234,1234,1234n"); if (c = getchar() = '-') L = InitList(-1); else L = InitList(1); if (isdigit(c) /判斷是否為10進(jìn)制數(shù) / 退格處理 ungetc(c, stdin); do scanf("%d", &data); while(data>9999) data=data/10; InsertNodeAtTail(L, data); while(c = getchar

14、() != 'n'); printf("Your Input is:n"); PrintList(L); return L; 該函數(shù)在其內(nèi)創(chuàng)建了一個(gè)雙向函數(shù)鏈表,通過返回該鏈表完成初始化,減少函數(shù)個(gè)數(shù),降低復(fù)雜度。L = (DualList)malloc(sizeof(DualNode)為開辟存儲(chǔ)空間,L->next = L->prior = L將其前驅(qū)、后繼都指向L,構(gòu)成循環(huán)。調(diào)用的函數(shù)InitList()是為了在頭結(jié)點(diǎn)存放符號(hào)。ungetc()的使用,是因?yàn)閷⒈驹撦斎雲(yún)s被取出的數(shù)返回到輸入流中去,以便正常輸入。do-while語句是為了當(dāng)輸入

15、回車時(shí),能夠停止。while(data>9999) data=data/10該句是為了當(dāng)輸入錯(cuò)誤,超過4位時(shí),取前四位當(dāng)做正常輸入存儲(chǔ)。PrintList(L)打印存儲(chǔ)的鏈表,以便觀察輸入的長整數(shù)是否符合預(yù)期,并在該函數(shù)中,解決當(dāng)輸入小于4位的錯(cuò)誤的情況,在前補(bǔ)0存儲(chǔ)。4.符號(hào)位的存放DualList InitList(int sign) /頭結(jié)點(diǎn)存放符號(hào)位,1為正,-1為負(fù) DualList L; L = (DualList)malloc(sizeof(DualNode); L->next = L->prior = L; L->data = sign; return

16、L; 建立一個(gè)雙向循環(huán)鏈表,并將其返回。在頭結(jié)點(diǎn)存儲(chǔ)其符號(hào)位,1為正,-1為負(fù)。5.符號(hào)位的初步判斷DualList AddList(DualList a, DualList b) /判斷符號(hào) DualList c; if (a->data * b->data > 0) c = InitList(a->data); Add(a, b, c); else c=InitList(b->data); Sub(a, b, c); return c;當(dāng)a,b符號(hào)相乘大于0時(shí),即相同時(shí),運(yùn)算后c的符號(hào)一定等于a的符號(hào),執(zhí)行Add()函數(shù)。當(dāng)a,b符號(hào)相乘小于0時(shí),即相異時(shí),運(yùn)

17、算后c的符號(hào)不一定等于b的符號(hào)。因?yàn)閨a|可能大于|b|,則需在Sub()函數(shù),進(jìn)一步進(jìn)行判斷。6.尾插用于輸入數(shù)據(jù)的存儲(chǔ)void InsertNodeAtTail(DualList L, int data) /在鏈表最后插入 /尾插,用于存儲(chǔ)數(shù)據(jù)的輸入 DualNode *s; s = (DualList)malloc(sizeof(DualNode); s->data = data; s->next = L; s->prior = L->prior; L->prior->next = s; L->prior = s;例如:輸入1,2345先是1被存

18、入一個(gè)新的結(jié)點(diǎn),在插入L的末尾,之后2345再存入結(jié)點(diǎn),插入末尾,如此一來,方便數(shù)據(jù)的調(diào)用。7.頭插用于運(yùn)算后數(shù)據(jù)的存儲(chǔ)void InsertNodeAtHead(DualList L, int data) / 即插在頭結(jié)點(diǎn)之后,用于計(jì)算結(jié)果的存儲(chǔ) DualNode *s; s = (DualList)malloc(sizeof(DualNode); s->data = data; s->next = L->next; s->prior = L; L->next->prior = s; L->next = s;例如:a=1234,5678 b=1,00

19、01。在本程序中,無論加減運(yùn)算都從最后四位向前運(yùn)算,則在頭結(jié)點(diǎn)后存儲(chǔ),即為順序存儲(chǔ),符合人的思維邏輯。即先在頭結(jié)點(diǎn)存入5679,再在頭結(jié)點(diǎn)后存入1235,這樣存儲(chǔ)著為:1235,5679。8.打印void PrintList(DualList L) /打印 int FirstTime = 1; DualNode *p = L; if (p->data = -1&&p->next->data!=0) printf("-"); p = p->next; while(p != L) if (FirstTime) FirstTime = 0;

20、 printf("%d", p->data); else printf(",%04d", p->data); p = p->next; printf("n");if (p->data = -1&&p->next->data!=0) printf("-")首先判斷頭結(jié)點(diǎn)的符號(hào)并將其輸出。FirstTime的作用是判斷是否為前四位,當(dāng)FirstTime=0時(shí),則需要在前輸出逗號(hào)。在本函數(shù)中,printf(",%04d", p->data)解決

21、了當(dāng)輸入小于4位時(shí)的輸入錯(cuò)誤,通過在前補(bǔ)0的方法。9.加預(yù)算void Add(DualList a, DualList b, DualList c) DualList pa, pb; int carry = 0, tmp; pa = a->prior; pb = b->prior; while(pa != a) && (pb != b) tmp = pa->data + pb->data + carry; if (tmp >= 10000) carry = 1; tmp -= 10000; else carry = 0; InsertNodeAtH

22、ead(c, tmp); pa = pa->prior; pb = pb->prior; while(pa != a) / pb = b tmp = pa->data + carry; if (tmp >= 10000) carry = 1; tmp -= 10000; else carry = 0; InsertNodeAtHead(c, tmp); pa = pa->prior; while(pb != b) / pa = a tmp = pb->data + carry; if (tmp >= 10000) carry = 1; tmp -= 1

23、0000; else carry = 0; InsertNodeAtHead(c, tmp); pb = pb->prior; if (carry != 0) InsertNodeAtHead(c, 1);本函數(shù)主要由3個(gè)while語句和一個(gè)if語句構(gòu)成。首先int carry = 0, tmp; carry代表著進(jìn)位,開始為0。tmp為存儲(chǔ)運(yùn)行中的結(jié)果。pa = a->prior; pb = b->prior; 因?yàn)閍,b為雙向循環(huán)鏈表,pa,pb指向其前驅(qū),則為a,b的末尾。例如:a=1,1111 b=2,2222 此時(shí)pa->data=1111,pb->da

24、ta=2222,符合運(yùn)算順序。第一個(gè)while語句:while(pa != a) && (pb != b)這是用來將a,b從后開始相同長度的結(jié)點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算。tmp = pa->data + pb->data + carry; 考慮進(jìn)位的正常加法if (tmp >= 10000) carry = 1; tmp -= 10000; else carry = 0;當(dāng)運(yùn)算結(jié)果大于等于10000時(shí),進(jìn)位carry=1,因?yàn)檫M(jìn)位,運(yùn)算結(jié)果減-10000。否則進(jìn)位為0。InsertNodeAtHead(c, tmp); 將運(yùn)算結(jié)果插入到c的頭結(jié)點(diǎn)后。pa = pa->

25、;prior; pb = pb->prior; 前移第二個(gè)while語句:while(pa != a) 則說明a的長度大于等于b,這是需將a剩余的結(jié)點(diǎn)導(dǎo)入c中,需要考慮進(jìn)位。第三個(gè)while語句:while(pa != a) 則說明b的長度大于a,這是需將b剩余的結(jié)點(diǎn)導(dǎo)入c中,需要考慮進(jìn)位。If語句當(dāng)a,b中的數(shù)據(jù)結(jié)點(diǎn)都運(yùn)算后,還存在進(jìn)位,則需要在c的頭結(jié)點(diǎn)插入1。10.減運(yùn)算void Sub(DualList a, DualList b, DualList c) DualList pa, pb, pc; int borrow = 0,tmp; pa = a->prior; pb

26、= b->prior; while(pa != a) && (pb != b) /判斷a>b還是a<b if (pa->data >= pb->data + borrow) borrow = 0; else borrow = 1; pa = pa->prior; pb = pb->prior; if (pa != a | (pa = a && pb = b && borrow = 0) /判斷a>b還是a<b / a >= b c->data = a->data; pa

27、 = a->prior; pb = b->prior; if(c->data!=b->data) /a>b情況 borrow=0; while(pa != a) && (pb != b) /將b中與a等大的相減導(dǎo)入c if (pa->data >= pb->data + borrow) /不存在借位 tmp = pa->data - pb->data - borrow; borrow = 0; else tmp = 10000 + pa->data - pb->data - borrow; borrow =

28、 1; InsertNodeAtHead(c, tmp); pa = pa->prior; pb = pb->prior; while(pa != a) /把a(bǔ)中剩余導(dǎo)入c if (pa->data >= borrow) tmp = pa->data - borrow; borrow = 0; else tmp = 10000 - pa->data - borrow; borrow = 1; InsertNodeAtHead(c, tmp); pa = pa->prior; else /c<b c->data=b->data; bor

29、row=0; while(pa != a) && (pb != b) /將a中與b等大導(dǎo)入c if (pb->data >= pa->data + borrow) tmp = pb->data - pa->data - borrow; borrow = 0; else tmp = 10000 + pb->data - pa->data - borrow; borrow = 1; InsertNodeAtHead(c, tmp); pa = pa->prior; pb = pb->prior; while(pb != b) /

30、導(dǎo)入b中剩余 if (pb->data >= borrow) tmp = pb->data - borrow; borrow = 0; else tmp = 10000 - pb->data - borrow; borrow = 1; InsertNodeAtHead(c, tmp); pb = pb->prior; pc = c->next; while(pc->next !=c && pc->data = 0) /為了防止頭因借位變?yōu)?的情況 pc = pc->next; DelNode(c, pc->prior)

31、; 本函數(shù)主要由1個(gè)while與2個(gè)if語句構(gòu)成。int borrow = 0,tmp; borrow表示借位,tmp同加函數(shù)。第一個(gè)while語句:while(pa != a) && (pb != b) /判斷a>b還是a<b if (pa->data >= pb->data + borrow) borrow = 0; else borrow = 1; pa = pa->prior; pb = pb->prior; 通過不斷地指向前驅(qū),以判斷a和b誰先到達(dá)頭結(jié)點(diǎn),以判斷a和b的絕對(duì)值誰大,從而判斷符號(hào)是否正確。第一個(gè)if語句:if (

32、pa != a | (pa = a && pb = b && borrow = 0) / a >= b c->data = a->data; 判斷a>b還是a<b,因?yàn)樵贏ddList函數(shù)中,將b的符號(hào)賦予給c,但如果a的絕對(duì)值大于b的絕對(duì)值,則將a的符號(hào)賦予給c,已完成符號(hào)位的正確判斷。第二個(gè)if語句:if(c->data!=b->data) /|a|>|b|情況 borrow=0; /重新置借位為0 while(pa != a) && (pb != b) /不為符號(hào)位時(shí)進(jìn)行 if (pa->

33、;data >= pb->data + borrow) /因?yàn)閨a|>|b|,應(yīng)該用大數(shù)減小數(shù) tmp = pa->data - pb->data - borrow; /考慮借位的減法 borrow = 0; /借位置0 else tmp = 10000 + pa->data - pb->data - borrow; /需向前一位借1 borrow = 1; InsertNodeAtHead(c, tmp); /在c的頭結(jié)點(diǎn)后插入 pa = pa->prior; pb = pb->prior; while(pa != a) /把a(bǔ)中剩余導(dǎo)入

34、c,因?yàn)閨a|>|b,則只可能a有剩余 if (pa->data >= borrow) tmp = pa->data - borrow; borrow = 0; else tmp = 10000 - pa->data - borrow; borrow = 1; InsertNodeAtHead(c, tmp); pa = pa->prior; Else 語句:大體內(nèi)容同上,只是|a|<|b|的區(qū)別。DelNode()函數(shù)的調(diào)用: pc = c->next; while(pc->next !=c && pc->data

35、= 0) pc = pc->next; DelNode(c, pc->prior); 這是為了防止開頭因借位變?yōu)?的情況。例如:a=1,0000 b=-1 運(yùn)算后為0,9999 ,這時(shí)0時(shí)多余的,需要?jiǎng)h除。11刪除多余0:void DelNode(DualList L, DualNode *p) p->prior->next = p->next; p->next->prior = p->prior; free(p);刪除結(jié)點(diǎn)12主函數(shù):int main() while(1) /多組輸入 DualList a, b, c; a = InputDat

36、a(); b = InputData(); c = AddList(a, b); printf("The result is:"); PrintList(c); printf("*n"); return 0;為了滿足實(shí)驗(yàn)要求,采用while(1)實(shí)現(xiàn)多組輸入。四、調(diào)試分析1.遇到的問題 在實(shí)驗(yàn)中,主要是在減函數(shù)中遇到的問題。首先我并沒有對(duì)a和b的長度進(jìn)行比較,而是直接開始對(duì)其相同長度的部分進(jìn)行減法運(yùn)算,對(duì)其借位進(jìn)行的是borrow = borrow?0:1;的操作,但在實(shí)現(xiàn)的過程中遇到了問題,借位總是會(huì)發(fā)生錯(cuò)誤,導(dǎo)致結(jié)果出錯(cuò)。在最后通過先判斷其大小,再進(jìn)

37、行減法這一符合正常算法的方式,解決了這個(gè)問題。 在調(diào)試時(shí),并沒有考慮多組輸入問題,一個(gè)一個(gè)輸入輸入十分麻煩,采用while(1)的方法。 在輸入的時(shí)候,經(jīng)常會(huì)多按或稍按幾個(gè)數(shù),導(dǎo)致其調(diào)試十分麻煩,則在程序中添加算法解決這個(gè)麻煩。2.算法的時(shí)空分析在本次實(shí)驗(yàn),主要是考慮長整數(shù)的加減法問題,并沒有太大的時(shí)間復(fù)雜度。其主要來源于輸入,輸入的輸出,加減法運(yùn)算,和輸出。由于這并不是一個(gè)很大的時(shí)間復(fù)雜度,改進(jìn)的方式只能從鏈表的存儲(chǔ)下手,減少存入和調(diào)出的次數(shù)已減少時(shí)間復(fù)雜度。3.經(jīng)驗(yàn)體會(huì)本次實(shí)驗(yàn)是求兩個(gè)無限長整數(shù)加減運(yùn)算。由于沒有限制長度和必須使用鏈表來表示兩個(gè)長整數(shù),這樣來求它們的加減運(yùn)算。在開始的時(shí)候,

38、不知道怎么去做。最后,明白應(yīng)該用模塊化,將程序分成一個(gè)個(gè)小部分,在將他們串聯(lián)起來,才能完成。雖然中間遇到了許多困難,但同樣復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)的知識(shí)和復(fù)習(xí)鏈表。五、用戶使用說明用戶在使用該程序時(shí),只需按照程序提示進(jìn)行即可實(shí)現(xiàn)長整數(shù)的加減運(yùn)算,具體使用步驟如下:1) 按照輸入格式輸入2) 此時(shí)會(huì)輸出你剛才的數(shù)值3) 按照輸入格式輸入第二個(gè)長整數(shù)4) 此時(shí)會(huì)輸出你剛才的數(shù)值5) 此時(shí)會(huì)輸出運(yùn)算結(jié)果6) 可重復(fù)上述操作,多次輸入六、測試結(jié)果與情況兩長整數(shù)a=b=0 b>a>0 a=1,1111,1111,1111 b=9,9999,9999,9999a>b>0 a=9999,999

39、9,9999 b=2 b<a<0 a=-2345,6789 b=-7654,3211a<0,b>0,|a|>|b| a=-1,0000,00001 b=2a<0,b>0,|a|<|b| a=-9999 b=1,0000a>0,b<0,|a|>|b| a=1,0000,0000 b=-9999 a>0,b<0,|a|<|b| a=1 b=-1,0000,0000錯(cuò)誤輸入(例:輸入超過四位,則自動(dòng)取其前四位進(jìn)行運(yùn)算) a=1,00000 b=-99998,01234 錯(cuò)誤輸入(例:非第一次輸入少于四位,則在輸入前加

40、0補(bǔ)足四位進(jìn)行運(yùn)算)a=1,000 b=-1,11附錄(源代碼):#include <stdio.h>#include <stdlib.h>#include <ctype.h>typedef struct DualNode int data; struct DualNode *prior, *next;DualNode, *DualList;DualList InitList(int sign) /頭結(jié)點(diǎn)存放符號(hào)位,1為正,-1為負(fù) DualList L; L = (DualList)malloc(sizeof(DualNode); L->next =

41、 L->prior = L; L->data = sign; return L;void InsertNodeAtTail(DualList L, int data) /在鏈表最后插入 /尾插,用于存儲(chǔ)數(shù)據(jù)的輸入 DualNode *s; s = (DualList)malloc(sizeof(DualNode); s->data = data; s->next = L; s->prior = L->prior; L->prior->next = s; L->prior = s;void InsertNodeAtHead(DualList

42、L, int data) / 即插在頭結(jié)點(diǎn)之后,用于計(jì)算結(jié)果的存儲(chǔ) DualNode *s; s = (DualList)malloc(sizeof(DualNode); s->data = data; s->next = L->next; s->prior = L; L->next->prior = s; L->next = s;void PrintList(DualList L) /打印結(jié)果 int FirstTime = 1; DualNode *p = L; if (p->data = -1&&p->next->

43、;data!=0) printf("-"); p = p->next; while(p != L) if (FirstTime) FirstTime = 0; printf("%d", p->data); else printf(",%04d", p->data); p = p->next; printf("n");DualList InputData() int count=0; int FirstNum = 1, data; char c; DualList L; L = (DualLi

44、st)malloc(sizeof(DualNode); L->next = L->prior = L; if (c = getchar() = '-') L = InitList(-1); else L = InitList(1); if (isdigit(c) /判斷是否為10進(jìn)制數(shù) / 退格處理 ungetc(c, stdin); do scanf("%d", &data); while(data>9999) data=data/10; InsertNodeAtTail(L, data); while(c = getchar()

45、 != 'n'); printf("您的輸入結(jié)果為:n"); PrintList(L); return L;void DelNode(DualList L, DualNode *p) p->prior->next = p->next; p->next->prior = p->prior; free(p);void Add(DualList a, DualList b, DualList c) DualList pa, pb; int carry = 0, tmp; pa = a->prior; pb = b->prior; while(pa != a) && (pb != b) tmp = pa->data + pb->data + carry; if (tmp >= 10000) carry = 1; tmp -= 10000; else carry = 0; InsertNodeAtHead(c, tmp); pa = pa->prior; pb = pb-&g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論