數(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頁,還剩50頁未讀 繼續(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)算的演示程序。要求輸入和輸出每四位一組,組間用逗號隔開。如: 1, 0000, 0000, 0000, 0000。3. 任務(wù)陳述:(a) 輸入的形式和輸入值的范圍:本實(shí)驗(yàn)中演示中,長整數(shù)的每位上的數(shù)字必須為數(shù)字0 9 之間, 長整數(shù)的位數(shù)要求無限長。測試的時(shí)候輸入數(shù)據(jù),當(dāng)輸入回車鍵的時(shí)候結(jié)束輸入,如果輸入的字符不符合題目要求,則程序能過濾這些不符合要求的字符。(b) 輸出的形式:

2、整數(shù)的范圍無限制,可為正數(shù),可為負(fù)數(shù)。按照中國對于長整數(shù)的表示習(xí)慣,每四位是一組,組間用逗號隔開。(c) 程序所能達(dá)到的功能: 演示程序以用戶和計(jì)算機(jī)的對話方式執(zhí)行,即在計(jì)算機(jī)顯示 “提示信息”后之后, 由用戶在鍵盤上輸入演示程序中規(guī)定的運(yùn)算命令;相應(yīng)的輸入數(shù)據(jù)和運(yùn)算結(jié)果顯示在其后,并對錯(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ù),每四位一

3、組: -1234,1234,1234 輸入長整數(shù)b您的運(yùn)算結(jié)果為:0 輸出b>a>0: -1234,1234,1234請按照如下形式輸入第一個(gè)長整數(shù),每四位一組1,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: -1234,1234,1234請按照如下形式輸入第一個(gè)長整數(shù),每四位一組9999,9999,9999您的輸入結(jié)果

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

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

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

7、則自動(dòng)取其前四位進(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,12341,000您的輸入結(jié)果為:1,0000請按照如下形式輸入第二個(gè)長整數(shù),每四位一組: -1234,1234,1234-1,11您的輸入結(jié)果

8、為:-1,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ù),則第一步需判斷其符號。先判斷長整數(shù)a,b 的符號的異同,相同,則將a 的符號存入新的雙向鏈表c 的符號位;相異,則將b的符號存入c,之后再處理。根據(jù) c 的符號位,使用加法或減法的函數(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ū)以及它的后繼,并使用它

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

10、t L, int data)操作結(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)生的多余的009) void PrintList(DualList L)操作

11、結(jié)果:打印鏈表10) 程及調(diào)用關(guān)系主程序模塊輸入a輸入b率 調(diào)用 InputData()PrintList()調(diào)用AddList()InitList()調(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 DualNodeint data;struct DualNode *prior, *next;DualNode, *DualList;雙向循環(huán)鏈表的節(jié)點(diǎn)由三個(gè)部分組成,第一是

12、數(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;printf("Please Input as Format: -1234,12

13、34,1234n");if (c = getchar() = '-')L = InitList(-1);elseL = InitList(1);if (isdigit(c) /判斷是否為10進(jìn)制數(shù)/ 退格處理ungetc(c, stdin);doscanf("%d", &data);while(data>9999) data=data/10;InsertNodeAtTail(L, data);while(c = getchar() != 'n');printf("Your Input is:n");

14、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)存放符號。ungetc() 的使用, 是因?yàn)閷⒈驹撦斎雲(yún)s被取出的數(shù)返回到輸入流中去,以便正常輸入。do-while 語句是為了當(dāng)輸入回車時(shí),能夠停止。while(data>9999) data=data/10該句是為了當(dāng)輸入錯(cuò)誤

15、,超過 4 位時(shí),取前四位當(dāng)做正常輸入存儲(chǔ)。PrintList(L) 打印存儲(chǔ)的鏈表,以便觀察輸入的長整數(shù)是否符合預(yù)期,并在該函數(shù)中,解決當(dāng)輸入小于4 位的錯(cuò)誤的情況,在前補(bǔ)0 存儲(chǔ)。4. 符號位的存放DualList InitList(int sign)/ 頭結(jié)點(diǎn)存放符號位,1 為正, -1 為負(fù)DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;L->data = sign;return L;建立一個(gè)雙向循環(huán)鏈表,并將其返回。在頭結(jié)點(diǎn)存儲(chǔ)其符號位,1 為正, -1為負(fù)。5. 符號位

16、的初步判斷DualList AddList(DualList a, DualList b) /判斷符號DualList c;if (a->data * b->data > 0)c = InitList(a->data);Add(a, b, c);elsec=InitList(b->data);Sub(a, b, c);return c;當(dāng) a, b 符號相乘大于0 時(shí),即相同時(shí),運(yùn)算后c 的符號一定等于a 的符號,執(zhí)行 Add() 函數(shù)。當(dāng) a, b 符號相乘小于0 時(shí), 即相異時(shí),運(yùn)算后 c 的符號不一定等于b 的符號。因?yàn)殚g 可能大于|b| ,則需在Sub()

17、函數(shù),進(jìn)一步進(jìn)行判斷。6. 尾插用于輸入數(shù)據(jù)的存儲(chǔ)/ 尾插,用于存儲(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 被存入一個(gè)新的結(jié)點(diǎn),在插入L 的末尾,之后2345 再存入結(jié)點(diǎn),插入末尾,如此一來,方便數(shù)據(jù)的調(diào)用。7. 頭插用于運(yùn)算后數(shù)據(jù)的存儲(chǔ)void InsertNodeAtHead(DualList

18、 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,0001 。在本程序中,無論加減運(yùn)算都從最后四位向前運(yùn)算,則在頭結(jié)點(diǎn)后存儲(chǔ),即為順序存儲(chǔ),符合人的思維邏輯。即先在頭結(jié)點(diǎn)存入5679, 再在頭結(jié)點(diǎn)后存入1235,這樣存儲(chǔ)著為:1235,5679。8

19、. 打印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;printf("%d", p->data);elseprintf(",%04d", p->data);p = p->next;printf(&q

20、uot;n");if (p->data = -1&&p->next->data!=0) printf("-")首先判斷頭結(jié)點(diǎn)的符號并將其輸出。FirstTime 的作用是判斷是否為前四位,當(dāng) FirstTime=0 時(shí), 則需要在前輸出逗號。在本函數(shù)中,printf(",%04d", p->data)解決了當(dāng)輸入小于4 位時(shí)的輸入錯(cuò)誤,通過在前補(bǔ)0 的方法。9. 加預(yù)算void Add(DualList a, DualList b, DualList c)DualList pa, pb;int carry

21、 = 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;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pa != a)/ pb = btmp = pa->data + carry;if (tmp >= 1

22、0000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;while(pb != b)/ pa = atmp = pb->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pb = pb->prior;if (carry != 0)InsertNodeAtHead(c, 1);本函數(shù)主要由3 個(gè) while 語句和一個(gè)if 語句構(gòu)成。

23、首先 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->data=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->d

24、ata + carry; 考慮進(jìn)位的正常加法if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 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->prior; pb = pb->prior;前移第二個(gè) while 語句:while(pa != a) 則說明a的長度大于等于b,這是需將a剩余的結(jié)點(diǎn)導(dǎo)入c 中,需要考慮進(jìn)位。第三個(gè) while 語句:while(pa

25、!= 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 = b->prior;while(pa != a) && (pb != b)/判斷a>b還是a<bif (pa->data >= pb->data + borrow)

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

27、中與 a 等大的相減導(dǎo)入cif (pa->data >= pb->data + borrow) /不存在借位tmp = pa->data - pb->data - borrow;borrow = 0;elsetmp = 10000 + pa->data - pb->data - borrow;borrow = 1;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;把 a 中剩余導(dǎo)入cwhile(pa != a)/if (pa->data >= borrow)tmp =

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

29、;borrow = 0;elsetmp = 10000 + pb->data - pa->data - borrow;borrow = 1;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pb != b) /導(dǎo)入 b 中剩余if (pb->data >= borrow)tmp = pb->data - borrow;borrow = 0;elsetmp = 10000 - pb->data - borrow;borrow = 1;InsertNodeAtHead(c, tm

30、p);pb = pb->prior;pc = c->next;while(pc->next !=c && pc->data = 0) /為了防止頭因借位變?yōu)?的情況pc = pc->next;DelNode(c, pc->prior);本函數(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<bif (pa->data &

31、gt;= pb->data + borrow)borrow = 0;elseborrow = 1;pa = pa->prior;pb = pb->prior;通過不斷地指向前驅(qū),以判斷 a 和 b 誰先到達(dá)頭結(jié)點(diǎn),以判斷 a 和 b 的絕對值誰大,從而判斷符號是否正確。第一個(gè) if 語句:if (pa != a | (pa = a && pb = b && borrow = 0)/ a >= bc->data = a->data;判斷a>b還是a<b,因?yàn)樵贏ddList函數(shù)中,將b的符號賦予給c,但如果a 的絕對

32、值大于b的絕對值,則將a的符號賦予給c,已完成符號位的正確判斷。第二個(gè) if 語句:if(c->data!=b->data)/|a|>|b|情況borrow=0;/重新置借位為0while(pa != a) && (pb != b)/不為符號位時(shí)進(jìn)行if (pa->data >= pb->data + borrow) /因?yàn)?|a|>|b|, 應(yīng)該用大數(shù)減小數(shù)tmp = pa->data - pb->data - borrow; /考慮借位的減法borrow = 0;/借位置 0elsetmp = 10000 + pa-&g

33、t;data - pb->data - borrow; /需向前一位借 1borrow = 1;InsertNodeAtHead(c, tmp);/在 c 的頭結(jié)點(diǎn)后插入pa = pa->prior;pb = pb->prior;while(pa != a) /把a(bǔ)中剩余導(dǎo)入c,因?yàn)閨a|>|b ,則只可能a有剩余if (pa->data >= borrow)tmp = pa->data - borrow;borrow = 0; elsetmp = 10000 - pa->data - borrow;borrow = 1;InsertNodeAt

34、Head(c, tmp);pa = pa->prior;Else 語句 : 大體內(nèi)容同上,只是|a|<|b| 的區(qū)別。DelNode() 函數(shù)的調(diào)用:pc = c->next;while(pc->next !=c && pc->data = 0)pc = pc->next;DelNode(c, pc->prior);這是為了防止開頭因借位變?yōu)? 的情況。例如: a=1,0000b=-1運(yùn)算后為0,9999 ,這時(shí) 0時(shí)多余的,需要?jiǎng)h除。11刪除多余0:void DelNode(DualList L, DualNode *p)p->

35、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 = InputData();b = InputData();c = AddList(a, b);printf("The result is:");PrintList(c);printf("*n");return 0;為了滿足實(shí)驗(yàn)要求,采用while(1) 實(shí)現(xiàn)多組輸入。I*四、調(diào)試分析1. 遇到的問題在實(shí)驗(yàn)中,主

36、要是在減函數(shù)中遇到的問題。首先我并沒有對a 和 b 的長度進(jìn)行比較,而是直接開始對其相同長度的部分進(jìn)行減法運(yùn)算,對其借位進(jìn)行的是borrow = borrow?0:1; 的操作,但在實(shí)現(xiàn)的過程中遇到了問題,借位總是會(huì)發(fā)生錯(cuò)誤, 導(dǎo)致結(jié)果出錯(cuò)。在最后通過先判斷其大小,再進(jìn)行減法這一符合正常算法的方式,解決了這個(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ù)雜度。其主要來源于輸入,

37、輸入的輸出,加減法運(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í)候,不知道怎么去做。 最后, 明白應(yīng)該用模塊化,將程序分成一個(gè)個(gè)小部分,在將他們串聯(lián)起來,才能完成。雖然中間遇到了許多困難,但同樣復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)的知識和復(fù)習(xí)鏈表。五、用戶使用說明用戶在使用該程序時(shí),只需按照程序提示進(jìn)行即可實(shí)現(xiàn)長整數(shù)的加減運(yùn)算,具體使用步驟如下:1)按照輸入格式輸入2)此時(shí)會(huì)輸出你剛才的數(shù)值3)按照輸入格式輸入第二

38、個(gè)長整數(shù)4)此時(shí)會(huì)輸出你剛才的數(shù)值5)此時(shí)會(huì)輸出運(yùn)算結(jié)果6)可重復(fù)上述操作,多次輸入六、測試結(jié)果與情況兩長整數(shù)a=b=0清枝般如一.形式箱八用 T二翌烈,每四位 月;12J4, 1231, 1L0-L 0您的輸入結(jié)果為:0_請按照如下形式輸入第二個(gè)長緲:-1234, 1234, 1234Q您的輸入結(jié)果為: 0您的運(yùn)算結(jié)果為:0 b>a>0 a=1,1111,1111,1111 b=9,9999,9999,9999情技照如下先式輸入第一個(gè)長整數(shù),每四位一組:-12弘,12弘,12弘 1, 1111, 1111, 1111您的輸入結(jié)果為:13 1111, 1111, 1111情按照如下

39、形式輸入第二個(gè)長整數(shù):T2碼您4,12弘% 99 阻 ggg% gggg您的輸入結(jié)果為:% 99以 999% 9999您的運(yùn)算結(jié)果為:IL 111L 1UL 1110 a>b>0 a=9999,9999,9999 b=2情按照如下形式輸入第一個(gè)長按數(shù),每四位一組:T23%12區(qū)12孔 9999, 9999t 9999您的輸入結(jié)果為: gggg gggg gggq青按船如下形布入第二個(gè)長整數(shù);T234, 1234, 1234 2國的輸入結(jié)果為:您的運(yùn)算結(jié)果為:h 0。0, 0000, 0001 b<a<0 a=-2345,6789 b=-7654,3211請技照如下附式輸

40、入第一個(gè)長整數(shù),每四位一組:T2MJ2弘J2弘-2345,6789您的輸入結(jié)果為:-2345 678請按的如下形式輸入第二個(gè)長整數(shù):T2M 123蟲12M-7654 3211您的輸入結(jié)果為:-7654, 3211您的宏算結(jié)果為:-L 0000,0000 a<0,b>0,|a|>|b| a=-1,0000,00001 b=2|按照如下形式輸入第一個(gè)長整數(shù),每四位一組;T23&I234J234-1, 0000, 00001忸的輸入結(jié)果為:-LOOOa 0001請按照如下形蝌入第二個(gè)長黎數(shù):7234, 1Z34J2342您的輸入結(jié)果為:2您的運(yùn)算結(jié)果為:7999, 0999

41、 a<0,b>0,|a|<|b| a=-9999 b=1,0000pC3|fF"請按照如下用式輸入第一個(gè)長整數(shù),每四位一組:T2弘,123蟲1234卜 9999區(qū)的輸入結(jié)果為:gggg請按,照如不用式輸入第二個(gè)長整數(shù):723生12弘,12弘1, 0000您的輸入轉(zhuǎn)果為:L 0000%的運(yùn)算結(jié)果為:1 a>0,b<0,|a|>|b| a=1,0000,0000 b=-9999ft按照如下用式輸入第一個(gè)長整數(shù),每四位一組:-L2雞12叫12孔1, 0000, 0000修的輸入結(jié)果為:1.0000.0000詰按照如下形編ft入第二個(gè)長整數(shù);T23% 1Z

42、股,1234-9999惶的輸入結(jié)果為:-9999叵的運(yùn)算結(jié)果為;9999, 0001 a>0,b<0,|a|<|b| a=1 b=-1,0000,0000,按照如下形式輸入第一個(gè)長整數(shù)每四位一組;T234112M4,1234士的輸入結(jié)果為:5按照如下形式輸入第二個(gè)長整數(shù):-12弘J2弘,1234-L 0000, 0000名的輸入結(jié)果為;-1, QQQQ.0QC0出的運(yùn)苴結(jié)臬為:-螞99, 9999*. .n .*.4* * * *,*、*!1* :iB«油ik*ai24C 1*油.1* .* n*油.1* .* 1*. .*lH, w口 11ra 1*錯(cuò)誤輸入(例:

43、輸入超過四位,則自動(dòng)取其前四位進(jìn)行運(yùn)算)a=1,00000 b=-99998,01234請按冊如下形式輸入第一個(gè)長整數(shù).每四位一組:-123包12江,1234 1.00000恿的輸入結(jié)果為:L oooo法按期如下形式輸入第二個(gè)長整數(shù):72璃12泡1234-99998,01234缶的輸入結(jié)果為:-9999? 1234回的運(yùn)算結(jié)果為:-9998, 1234錯(cuò)誤輸入(例:非第一次輸入少于四位,則在輸入前加0補(bǔ)足四位進(jìn)行 運(yùn)算)a=1,000 b=-1,11口,/rur fl *«,(+/,,,+,+11,+.+,r+«r*.+i,+,,S,«®'r w

44、i ww r *+,,S,«®'r wi '1""r ,.+,+4'i'r bi rf. i,®r eH,+. rs i®'r J't rf請依照如下形裝輸入重一個(gè)k®E,短四根一組:-1234, 123& 12整 1,000您的輸入結(jié)果為:1, 0000請按照如下形式輸入第二個(gè)長整數(shù)! T2弭1234, 1234-1. 11您的輸入結(jié)果為:-1 0011您的運(yùn)算結(jié)果為:-11附錄(源代碼):#include <stdio.h>#include <st

45、dlib.h>#include <ctype.h>typedef struct DualNodeint data;struct DualNode *prior, *next;DualNode, *DualList;DualList InitList(int sign)/ 頭結(jié)點(diǎn)存放符號位,1 為正, -1 為負(fù)DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;L->data = sign;return L;在鏈表最后插入void InsertNodeAtTail(D

46、ualList 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 L, int data)/ 即插在頭結(jié)點(diǎn)之后,用于計(jì)算結(jié)果的存儲(chǔ)DualNode *s;s = (DualList)malloc(sizeof(DualNode);s-

47、>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->data!=0) printf("-");p = p->next;while(p != L)if (FirstTime)FirstTime = 0;printf(

48、"%d", p->data);elseprintf(",%04d", p->data);p = p->next;printf("n");DualList InputData() int count=0;int FirstNum = 1, data;char c;DualList L;L = (DualList)malloc(sizeof(DualNode);L->next = L->prior = L;if (c = getchar() = '-')L = InitList(-1);els

49、eL = InitList(1);if (isdigit(c) /判斷是否為10進(jìn)制數(shù)/ 退格處理ungetc(c, stdin);doscanf("%d", &data);while(data>9999) data=data/10;InsertNodeAtTail(L, data);while(c = getchar() != 'n');printf(" 您的輸入結(jié)果為:n");PrintList(L);return L;void DelNode(DualList L, DualNode *p)p->prior-&g

50、t;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;elseca

51、rry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;while(pa != a)/ pb = btmp = pa->data + carry;if (tmp >= 10000)carry = 1;tmp -= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;while(pb != b)/ pa = atmp = pb->data + carry;if (tmp >= 10000)carry = 1;tmp -

52、= 10000;elsecarry = 0;InsertNodeAtHead(c, tmp);pb = pb->prior;if (carry != 0)InsertNodeAtHead(c, 1);DualList pa, pb, pc;int borrow = 0,tmp;pa = a->prior;pb = b->prior;while(pa != a) && (pb != b)/判斷 a>b 還是 a<bif (pa->data >= pb->data + borrow)borrow = 0;elseborrow = 1;pa = pa->prior;pb = pb->prior;if (pa != a | (pa = a &

溫馨提示

  • 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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論