版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p> 題目:長整數(shù)四則運(yùn)算</p><p><b> 一、需求分析</b></p><p><b> 1.問題描述:</b></p><p> 由于工程上有時(shí)候需要對很大的數(shù)進(jìn)行計(jì)算,但是計(jì)算機(jī)本身提供的數(shù)據(jù)類型無法保存幾百位甚至幾千位
2、的數(shù)字,所以需要設(shè)計(jì)專門的算法對數(shù)據(jù)進(jìn)行相應(yīng)的計(jì)算。此程序的設(shè)計(jì)任務(wù)是:設(shè)計(jì)一個(gè)程序能夠?qū)崿F(xiàn)長整數(shù)運(yùn)算的程序,而且能夠?qū)σ恍╁e(cuò)誤異常進(jìn)行辨別調(diào)整,計(jì)算出正確的結(jié)果。程序輸入格式是字符串,保存時(shí)需要用雙向循環(huán)鏈表將字符串每四位保存在循環(huán)鏈表中的一個(gè)節(jié)點(diǎn)中,然后再計(jì)算后運(yùn)行出結(jié)果。</p><p><b> 2.基本功能</b></p><p> 功能一:建立雙向循環(huán)
3、鏈表,計(jì)算鏈表個(gè)數(shù),對鏈表的數(shù)據(jù)進(jìn)行修改,能在鏈表中插入結(jié)點(diǎn)。</p><p> 功能二:將字符串轉(zhuǎn)換成相應(yīng)的數(shù)字存儲(chǔ)在雙向循環(huán)鏈表中</p><p> 功能三:對存入雙向循環(huán)鏈表的長整數(shù)進(jìn)行相加,相減,相除。</p><p><b> 3.輸入輸出</b></p><p> 程序輸入以字符串的形式輸入,數(shù)據(jù)的類
4、型是字符串,包含元素的范圍是數(shù)字,逗號,負(fù)號。</p><p> 輸入時(shí)用字符串輸入,輸出時(shí)以一鏈表結(jié)點(diǎn)輸出,而且每個(gè)結(jié)點(diǎn)表示四位。</p><p><b> 二、概要設(shè)計(jì)</b></p><p><b> 1.設(shè)計(jì)思路:</b></p><p> 由于計(jì)算機(jī)無法完成位數(shù)很大的數(shù)字計(jì)算,設(shè)計(jì)
5、思路就是將很長的數(shù)據(jù)進(jìn)行分割,一部分一部分的用計(jì)算機(jī)固有數(shù)據(jù)類型進(jìn)行計(jì)算。將各部分的結(jié)果整合起來。由于計(jì)算機(jī)固有的整數(shù)類型存數(shù)的對大整數(shù)是2^15-1,所以為了方便,且符合中國人對長整數(shù)的表示習(xí)慣,建立一個(gè)雙向循環(huán)鏈表,每個(gè)結(jié)點(diǎn)存儲(chǔ)四位數(shù)字,以萬為進(jìn)制。從最低位開始加法,超過一萬向上進(jìn)位,所以每次加法應(yīng)該是對應(yīng)兩個(gè)結(jié)點(diǎn)和進(jìn)位數(shù)相加,進(jìn)位值初始為0;減法也是一個(gè)結(jié)點(diǎn)計(jì)算一次,每次計(jì)算應(yīng)該是第一個(gè)鏈表對應(yīng)的結(jié)點(diǎn)值減去第二個(gè)結(jié)點(diǎn)的值和借位值的
6、和,借位值初始值為0;除法的計(jì)算可以借助減法,被減數(shù)被減數(shù)減一次則最終結(jié)果加一;直至被減數(shù)比減數(shù)小。</p><p><b> 2.數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):</b></p><p> 因?yàn)橛?jì)算的是一個(gè)連續(xù)的數(shù)字,需要桉順序一次計(jì)算,所以采用的數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)是線性表。因?yàn)橐竺恳粋€(gè)結(jié)點(diǎn)只存儲(chǔ)四位數(shù)字,為了將數(shù)字連接起來,采用的數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)結(jié)構(gòu)是鏈?zhǔn)健?lt;/p>
7、<p> 1.雙向循環(huán)鏈表的抽象數(shù)據(jù)類型定義為:</p><p><b> ADT Link</b></p><p><b> {</b></p><p> 數(shù)據(jù)對象:D={ai | ai∈CharSet,i=1,2,……,n,n≥0}</p><p> 數(shù)據(jù)關(guān)系; R={&
8、lt;ai-1,ai> | ai-1,ai∈D,i=2,……,n}</p><p><b> }</b></p><p><b> 基本操作:</b></p><p> InitLinkList(&L,a) </p><p> 操作結(jié)果:構(gòu)造一個(gè)雙向循環(huán)鏈表L ,用a判斷是正數(shù)
9、還是負(fù)數(shù) </p><p> DestroyList(&L) </p><p> 初始條件:雙向循環(huán)兩已經(jīng)存在</p><p> 操作結(jié)果:銷毀有序表L</p><p> Insert(&L,a)</p><p> 初始條件:雙向循環(huán)鏈表已經(jīng)存在</p><p>
10、操作結(jié)果:在循環(huán)鏈表的末尾插入一個(gè)結(jié)點(diǎn),且此結(jié)點(diǎn)的數(shù)據(jù)值為a</p><p> HeadInsert(&L,a)</p><p> 初始條件:雙向循環(huán)鏈表已經(jīng)存在</p><p> 操作結(jié)果:在循環(huán)鏈表的頭結(jié)點(diǎn)后插入一個(gè)結(jié)點(diǎn),且此結(jié)點(diǎn)的數(shù)據(jù)值為a</p><p> CountNode(&L)</p>&l
11、t;p> 初始條件:雙向循環(huán)鏈表存在</p><p> 操作結(jié)果:計(jì)算出鏈表中結(jié)點(diǎn)的個(gè)數(shù),并返回個(gè)數(shù)</p><p> Compare(&L1, &L2)</p><p> 初始條件:L1和L2存在</p><p> 操作結(jié)果:比較兩個(gè)雙向循環(huán)鏈表的大小,用返回值1表示L1大于L2,返回值-1標(biāo)志L1小于L2,
12、返回值0標(biāo)志L1和L2相等</p><p> ToNum(*s,i,&e) </p><p> 初始條件:s為字符串中指向某個(gè)字符的指針</p><p> 操作結(jié)果:將s的前i個(gè)字符轉(zhuǎn)換為數(shù)字,存入e中</p><p> CreatNum(&L,&s)</p><p> 初始條件:s
13、為某個(gè)字符串,雙向循環(huán)鏈表L存在</p><p> 操作結(jié)果:將字符串s轉(zhuǎn)換成數(shù)字存入到循環(huán)鏈表L中</p><p> Add(L1,L2, op) </p><p> 初始條件:雙向循環(huán)鏈表L1和L2存在,op為結(jié)果的標(biāo)識符</p><p> 操作結(jié)果:兩個(gè)鏈表相加,求出結(jié)果。</p><p> Sub(
14、L1,L2, op) </p><p> 初始條件:雙向循環(huán)鏈表L1和L2存在</p><p> 操作結(jié)果:L1減去L2,求出結(jié)果 ,op為結(jié)果的標(biāo)識符</p><p> EraseZero(Link &L)</p><p> 初始條件:雙向循環(huán)鏈表L存在</p><p> 操作結(jié)果:刪去L鏈表頭結(jié)
15、點(diǎn)后,第一個(gè)數(shù)據(jù)不為零結(jié)點(diǎn)前的所有數(shù)據(jù)為零的結(jié)點(diǎn)。</p><p> 如果結(jié)點(diǎn)數(shù)據(jù)都為零,則保存一個(gè)結(jié)點(diǎn)。</p><p><b> print(L)</b></p><p> 初始條件:雙向循環(huán)鏈表L存在</p><p> 操作結(jié)果:從L頭結(jié)點(diǎn)開始順此打印每個(gè)結(jié)點(diǎn)中的數(shù)據(jù)</p><p>
16、;<b> 3.軟件結(jié)構(gòu)設(shè)計(jì):</b></p><p> 本程序包含四個(gè)模塊:</p><p><b> 1.主程序模塊</b></p><p> Int main()</p><p><b> {</b></p><p><b>
17、 接受命令</b></p><p> While(“命令”!=“退出”)</p><p><b> {</b></p><p><b> 輸入字符串</b></p><p><b> 建立雙向循環(huán)鏈表</b></p><p> 將字
18、符串轉(zhuǎn)換為要求的格式存入鏈表的每個(gè)結(jié)點(diǎn)</p><p> 對鏈表中數(shù)據(jù)進(jìn)行即興操作數(shù)理</p><p><b> 再次接受命令</b></p><p><b> }</b></p><p><b> }</b></p><p> 2.雙向鏈表操
19、作模塊------實(shí)現(xiàn)結(jié)點(diǎn)的插入、刪除、修改</p><p> 3.字符串轉(zhuǎn)換存儲(chǔ)模塊----實(shí)現(xiàn)將字符串轉(zhuǎn)換為數(shù)字按格式存儲(chǔ)在鏈表中</p><p> 4.數(shù)據(jù)計(jì)算模塊—--------對存儲(chǔ)在鏈表中的數(shù)據(jù)進(jìn)行計(jì)算,得到最終期望的結(jié)果</p><p> 各個(gè)模塊調(diào)用的關(guān)系如下:</p><p> 主程序模塊中的函數(shù)原型:</p
20、><p> void Interface()-------------------操作界面函數(shù)</p><p> Status CreatNum(Link &L,char*s)----創(chuàng)建數(shù)字鏈表函數(shù)</p><p> Link Compute(Link &L1,Link &L2,char Ope)----數(shù)據(jù)計(jì)算函數(shù)</p>
21、<p><b> 數(shù)據(jù)運(yùn)算模塊:</b></p><p> Link Add(Link &L1,Link &L2,char op) ----加法計(jì)算</p><p> Link Sub(Link &L1,Link &L2,char op) ----減法運(yùn)算</p><p><
22、;b> 雙向鏈表操作模塊</b></p><p> void InitLinkList(Link &L,char a)</p><p> Status DestroyList(Link &L)</p><p> Status Insert(Link &L,Elemtype a)</p><p>
23、; int CountNode(Link L)</p><p> BOOL Compare(Link &L1,Link &L2)</p><p> void EraseZero(Link &L)</p><p> Status HeadInsert(Link &L,Elemtype a) </p><p&
24、gt;<b> 字符串轉(zhuǎn)換模塊</b></p><p> Status CreatNum(Link &L,char*s)</p><p> Status ToNum(char*s,int i,long &e)</p><p><b> 人機(jī)界面:</b></p><p>&l
25、t;b> 三、 詳細(xì)設(shè)計(jì) </b></p><p> 1..根據(jù)分析和鏈表操作的特點(diǎn),采用雙向循環(huán)鏈表實(shí)現(xiàn),這里頭結(jié)點(diǎn)存儲(chǔ)數(shù)字的符號。</p><p> typedef long Elemtype ;</p><p> typedef int Status;</p><p> typedef int BOOL;&
26、lt;/p><p> typedef struct LNode{</p><p> Elemtype data;</p><p> LNode *next;</p><p> LNode *prior;</p><p> }Node,*Link;</p><p> void InitLi
27、nkList(Link &L,char a){</p><p> //對一個(gè)雙向循環(huán)鏈表進(jìn)行初始化,分配頭結(jié)點(diǎn)</p><p> L = (Link)malloc(sizeof(Node));//動(dòng)態(tài)分配存儲(chǔ)空間</p><p> If(!L) return FALSE;</p><p> if(a == '-'
28、;) L->data = -1;//L->data存放符號節(jié)點(diǎn),如果是‘-’則為,否則為0</p><p> else L->data = 1;</p><p> L->prior = L;</p><p> L->next = L;</p><p><b> }</b></p
29、><p> Status DestroyList(Link &L){</p><p><b> //銷毀鏈表L</b></p><p> if(!L)return ERROR;//鏈表不存在</p><p> p = L->prior;//p指向鏈表頭節(jié)點(diǎn)的前驅(qū)</p><p>
30、 while(p!=L)//刪除節(jié)點(diǎn)節(jié)點(diǎn)p</p><p><b> {</b></p><p> q = p->prior;</p><p> free(p);//釋放節(jié)點(diǎn)p的空間</p><p><b> p = q;</b></p><p><b&
31、gt; }</b></p><p> free(L);//釋放鏈表L的存儲(chǔ)空間</p><p> return OK;</p><p><b> }</b></p><p> Status Insert(Link &L,Elemtype a){</p><p> /
32、/分配一個(gè)結(jié)點(diǎn),并將其數(shù)據(jù)值存為a,插入到鏈表的末尾</p><p> p=(Link)malloc(sizeof(LNode));</p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p><p> p->next=p->prior=NULL;<
33、/p><p> p->data=a;</p><p> Link q=L->prior;</p><p> q->next=p;</p><p> p->prior=q;</p><p> p->next=L;</p><p> L->prior=p;
34、</p><p> return OK;</p><p><b> }</b></p><p> Status HeadInsert(Link &L,Elemtype a){ </p><p> //分配一個(gè)結(jié)點(diǎn),并將其數(shù)據(jù)值存為a,按頭插入法插入</p><p> p=(Li
35、nk)malloc(sizeof(LNode));</p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p><p> p->data=a; </p><p> Link q=L->next;</p><
36、p> q->prior=p;</p><p> p->next=q;</p><p> L->next=p;</p><p> p->prior=L;</p><p> return OK;</p><p><b> }</b></p>&l
37、t;p> Status ToNum(char*s,int i,long &e){</p><p> //將字符串s的前i位轉(zhuǎn)換為正數(shù),并由e保存</p><p><b> sum=0;</b></p><p> for(m=1,n=1;m<=i;n=n*10) //n的值每次是原來的10倍</p>&l
38、t;p><b> {</b></p><p> sum+=(*(s-m)-'0')*n; //轉(zhuǎn)換成相應(yīng)的數(shù)字</p><p><b> m++;</b></p><p><b> }</b></p><p><b> e
39、=sum;</b></p><p> return OK;</p><p> Status CreatNum(Link &L,char*s){</p><p> //將字符串轉(zhuǎn)分割成很多部分,每部分轉(zhuǎn)換為數(shù)字后存在一個(gè)鏈表結(jié)點(diǎn)中。</p><p> InitLinkList(L,s[0]);</p>
40、<p> if(*s=='-')</p><p> { InitLinkList(L,s[0]); s++;</p><p><b> }</b></p><p><b> else</b></p><p> InitLinkList(L,s[0]);<
41、;/p><p> while(*s!='\0')</p><p><b> {</b></p><p> if(*s==',')</p><p> { ToNum(s,i,e);</p><p> Insert(L,e);</p><
42、p> i=-1; //因?yàn)檫@是已經(jīng)將某一個(gè)逗號前i個(gè)字符變成數(shù)字加入 </p><p> } //數(shù)字鏈表中,逗號不算本次</p><p><b> i++;</b></p><p><b> s++;</b></p><p>&l
43、t;b> }</b></p><p> ToNum(s,i,e); </p><p> Insert(L,e);</p><p><b> }</b></p><p> int CountNode(Link L){</p><p> //計(jì)算鏈表L的結(jié)點(diǎn)數(shù)</
44、p><p> Link p=L->next;</p><p> while(p!=L)</p><p><b> {</b></p><p><b> i++;</b></p><p> p=p->next;</p><p><
45、b> }</b></p><p><b> return i;</b></p><p><b> }</b></p><p> BOOL Compare(Link &L1,Link &L2){</p><p> //比較鏈表L1和L2的大小,如果L1大于L
46、2,返回1,如果L2大于L1,返回-1,如果相等,返回0</p><p><b> {</b></p><p> if(CountNode(L1)>CountNode(L2))</p><p><b> // L1大于L2</b></p><p> else if(CountNode(
47、L1)<CountNode(L2))</p><p><b> L2大于L1</b></p><p><b> else{</b></p><p> p1=L1->next,p2=L2->next;</p><p> while(p1!=L1&&p2!=L2
48、)</p><p><b> {</b></p><p> if(p1->data>p2->data)</p><p><b> // L1大于L2</b></p><p> if(p1->data<p2->data)</p><p&g
49、t; return -1;</p><p> p1=p1->next;</p><p> p2=p2->next;</p><p><b> }</b></p><p><b> }</b></p><p><b> L1和L2相等</
50、b></p><p><b> }</b></p><p> Link Add(Link &L1,Link &L2,char op) 主要函數(shù)</p><p> //將字符串L1和L2的數(shù)據(jù)相加,得到的結(jié)果鏈表頭結(jié)點(diǎn)指針返回</p><p> Link Sub(L
51、ink L1,Link L2,char op) 主要函數(shù)</p><p> //將字符串L1和L2的數(shù)據(jù)相減,得到的結(jié)果鏈表的頭結(jié)點(diǎn)指針返回</p><p> void EraseZero(Link &L)</p><p> {//刪除鏈表L的無效零元素結(jié)點(diǎn)</p><p> p=L->
52、;next,q;</p><p> while(p->data==0&&p->next!=L)</p><p><b> {</b></p><p><b> q=p;</b></p><p> p=p->next;</p><p>
53、 p->prior=q->prior;</p><p><b> free(q);</b></p><p><b> }</b></p><p> L->next=p;</p><p><b> }</b></p><p>
54、 Link Compute(Link &L1,Link &L2,char Ope) //主要函數(shù)</p><p> //對鏈表L1和鏈表L2進(jìn)行計(jì)算,即相加,相減等等</p><p> void Interface() </p><p> //界面函數(shù),顯示操作的主界面</p><p> Sta
55、tus print(Link L){</p><p> //順次打印鏈表L中的數(shù)據(jù)</p><p> EraseZero(L);</p><p> if(*s<48&&*s!='-'||*s>57) //第一個(gè)不是數(shù)字也不是-,則出錯(cuò)</p><p> return
56、ERROR;</p><p> if(*s=='-') k=0;</p><p> else k=1;</p><p><b> i=1;</b></p><p> while(*(s+i)!='\0')</p><p><b
57、> {</b></p><p> if(*(s+i)!=','&&(*(s+i)>57||*(s+i)<48))</p><p> return ERROR;</p><p><b> i++;</b></p><p><b> }<
58、/b></p><p><b> i=1;</b></p><p> while(*(s+i)!=','&&*(s+i)!='\0') {</p><p><b> i++;</b></p><p><b> k++;</
59、b></p><p><b> }</b></p><p><b> if(k>5)</b></p><p> return ERROR;</p><p> if(*(s+i)=='\0')</p><p> return OK;<
60、/p><p><b> k=4;</b></p><p> while(*(s+i)!='\0')</p><p><b> {</b></p><p> if(*(s+i)==',')</p><p><b> {</b
61、></p><p><b> if(k!=4)</b></p><p> return ERROR;</p><p> k=-1; //此時(shí)逗號字符不能在四個(gè)數(shù)字的計(jì)算之中</p><p><b> }</b></p>&
62、lt;p><b> k++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p> if(k!=4) //最后一個(gè)逗號后必須有四個(gè)數(shù)</p><p&g
63、t; return ERROR;</p><p> return OK;</p><p><b> 函數(shù)調(diào)用關(guān)系圖:</b></p><p><b> 調(diào)試分析 </b></p><p> 1.實(shí)際完成的功能有:長整數(shù)的加法和減法,支持的數(shù)據(jù)類型是整形,能夠?qū)Ξ惓]斎脒M(jìn)行判斷,打印和計(jì)算的
64、時(shí)候能夠消除可能出現(xiàn)的前置零。</p><p> 2.程序的主要函數(shù)compute時(shí)間復(fù)雜度為O(n),其實(shí)n為計(jì)算的兩個(gè)鏈表的結(jié)點(diǎn)個(gè)數(shù)的較大值。物理存儲(chǔ)使用的是雙向鏈表,有兩個(gè)指針域,空間消耗在合理范圍之內(nèi)</p><p> 3.調(diào)試中由于是雙向鏈表,在插入時(shí)應(yīng)該注意將prior域進(jìn)行考慮,剛開始寫程序時(shí)忘記,導(dǎo)致輸出結(jié)果錯(cuò)誤。清楚前置零的時(shí)候開始沒有考慮輸入數(shù)據(jù)全是零的時(shí)候,結(jié)果將
65、全部的數(shù)據(jù)結(jié)點(diǎn)都給刪除,最后沒有結(jié)果輸出,調(diào)試中發(fā)現(xiàn)這個(gè)問題,應(yīng)該將每個(gè)鏈表至少保存一個(gè)數(shù)據(jù)結(jié)點(diǎn)。</p><p> 4.由于時(shí)間倉促,而且長整數(shù)四則運(yùn)算的乘法一直沒有想到好的辦法,如果再有幾天時(shí)間,乘法這個(gè)功能完全可以加上。隨之就可以完成乘方的計(jì)算</p><p> 5.本程序還有很大的擴(kuò)充地方,應(yīng)該可以將程序由正數(shù)擴(kuò)充為浮點(diǎn)數(shù),能夠運(yùn)行更復(fù)雜的數(shù)據(jù),如求階乘,開方等功能。如果實(shí)現(xiàn)了
66、,則這個(gè)計(jì)算器的功能方面就可以和windows系統(tǒng)自帶的計(jì)算器媲美了。</p><p><b> 五、測試結(jié)果</b></p><p> 列出你的測試結(jié)果,包括輸入和輸出。注意測試數(shù)據(jù)應(yīng)該完整和嚴(yán)格,至少給出2組測試結(jié)果(含合法數(shù)據(jù)與非法數(shù)據(jù))。</p><p><b> 輸入0;0,輸出0</b></p>
67、;<p> 輸入1,0001,0001;-1,0001,0001;輸出0</p><p> 輸入1,0001,0001;-1,0001,0000;輸出1</p><p> 輸入-9999,9999;-9999;9999;輸出-1,9999,9998</p><p><b> 非法數(shù)據(jù)</b></p><
68、p> 1,000;000,1;輸出“輸入錯(cuò)誤”</p><p><b> 六、用戶手冊</b></p><p> 說明如何使用你編寫的程序,詳細(xì)列出每一步的具體操作步驟。這里可以有適當(dāng)?shù)倪\(yùn)行結(jié)果抓圖。用戶手冊與開發(fā)過程無關(guān),只與使用有關(guān),必須是Step by Step的。 </p><p> 所有運(yùn)行結(jié)果截圖均要求有實(shí)際數(shù)據(jù)的內(nèi)容
69、,截圖尺寸要求按頁寬排版兩張大小,且要求有每張圖下面有規(guī)范的標(biāo)題說明如何使用你編寫的程序,詳細(xì)列出每一步的操作步驟。</p><p><b> 1.進(jìn)入操作主界面</b></p><p> 2.按照命令提示操作</p><p> ⑴選1,進(jìn)入加法運(yùn)算</p><p> ?、佥斎氲谝粋€(gè)操作數(shù):并且按照提示格式輸入&l
70、t;/p><p> 如果輸入錯(cuò)誤,比如1,000,則程序會(huì)提示錯(cuò)誤,重新輸入</p><p> ?、谌绻斎胝_,比如輸入1,0000,輸入下一個(gè)數(shù)</p><p> ③輸入正確,如輸入9999,9999 則計(jì)算出結(jié)果</p><p> ④輸出每個(gè)鏈表中的結(jié)點(diǎn)值,便于觀察比較</p><p> ?、葺敵鼋Y(jié)果1,000
71、0,9999</p><p> ?、七x2,進(jìn)入減法運(yùn)算</p><p> ?、佥斎氲谝粋€(gè)操作數(shù),并按照提示的格式輸入</p><p> 如果輸入錯(cuò)誤,比如,10,000,程序會(huì)提示輸入錯(cuò)誤,重新輸入</p><p> ?、谌绻斎胝_,比如9999,9999,輸入下一個(gè)數(shù)。</p><p> ③第二個(gè)數(shù)也輸入正確,
72、比如輸入10,0000,輸出結(jié)果</p><p> ④提示是否繼續(xù)計(jì)算,選擇Y或者y退出,其他任意鍵繼續(xù)操作</p><p> 七、體會(huì)與自我評價(jià) </p><p> 長整數(shù)四則運(yùn)算的一些思考</p><p> 這次的課程設(shè)計(jì)中,長整數(shù)四則運(yùn)算這個(gè)實(shí)驗(yàn)給了我很大的挑戰(zhàn),在設(shè)計(jì)中遇到了很多的困難,比如如何用如何將字符數(shù)據(jù)分割成很多部分存
73、儲(chǔ)進(jìn)雙向循環(huán)鏈表,如何判斷輸入的字符串是否是正確的;在輸入特殊數(shù)據(jù)買比如0000,00000時(shí),程序能夠消除無用的前置零得出正確的結(jié)果,我在這些問題上都考慮的很久,一點(diǎn)點(diǎn)的攻破難題,</p><p> 而在這次實(shí)驗(yàn)中我對長正數(shù)的各種運(yùn)算也有了一定的認(rèn)識,對于特別長的數(shù)的計(jì)算,只能先求局部結(jié)果,最后將局部結(jié)果綜合起來,得到最終結(jié)果。比如加法就是從最低位開始計(jì)算,判斷進(jìn)位后再一次向高位計(jì)算,最終得到結(jié)果。計(jì)算加法的
74、時(shí)候,由于是每四位一個(gè)結(jié)點(diǎn),所以是以萬位為進(jìn)制。輸出時(shí)如果一個(gè)結(jié)點(diǎn)中數(shù)據(jù)是以為,則前面輸出三個(gè)零,如果是兩位,則輸出兩個(gè)零,如果是三位,則輸出一個(gè)零,四位數(shù)直接輸出。如果節(jié)點(diǎn)數(shù)據(jù)為零,則按第一種情況輸出是前面加三個(gè)零即可。為了程序的健壯性,應(yīng)該考慮負(fù)數(shù)和正數(shù)相加的情況,如果一個(gè)較大的正數(shù)加上一個(gè)數(shù)值較小的負(fù)數(shù),應(yīng)該是大數(shù)減去去掉振幅符號的小數(shù),即可。如果是一個(gè)較小的正數(shù)加上一個(gè)數(shù)值較大的負(fù)數(shù),則應(yīng)該是去掉正負(fù)號的負(fù)數(shù)減去正數(shù),最后在結(jié)果
75、里加上一個(gè)負(fù)號即可。</p><p> 乘法的基本思想是相加,但是在雙向循環(huán)鏈表中,如果乘數(shù)很大的時(shí)候,單純的相加要進(jìn)行很多次,效率上完全不夠滿足要求,一般是用字符串直接按位相乘,按豎式結(jié)構(gòu)計(jì)算。</p><p> 除法的實(shí)現(xiàn)可以用減法,但是問題還是和乘法一樣,如果數(shù)字太大的話,用雙向循環(huán)鏈表,要進(jìn)行的減法次數(shù)也是很龐大的。</p><p> 以上是我對長整數(shù)
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-長整數(shù)加減運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--大整數(shù)的運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--長整數(shù)的四則運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---長整數(shù)的代數(shù)計(jì)算
- 任意長整數(shù)加法運(yùn)算-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)----集合運(yùn)算課程設(shè)計(jì)報(bào)告(c++)
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(集合交集并集運(yùn)算)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 稀疏矩陣運(yùn)算器設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論