大整數(shù)階乘程序設(shè)計(jì)_第1頁(yè)
大整數(shù)階乘程序設(shè)計(jì)_第2頁(yè)
大整數(shù)階乘程序設(shè)計(jì)_第3頁(yè)
大整數(shù)階乘程序設(shè)計(jì)_第4頁(yè)
大整數(shù)階乘程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、-. z.程序設(shè)計(jì)報(bào)告 2010 / 2011學(xué)年 第 一 學(xué)期 題 目: 大整數(shù)階乘 專(zhuān) 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 生 姓 名 *賽班 級(jí) 學(xué) 號(hào) B09040121 指 導(dǎo) 教 師 楊一濤 指 導(dǎo) 單 位 計(jì)算機(jī)學(xué)院 日 期 評(píng) 分 細(xì) 則評(píng)分項(xiàng)優(yōu)秀良好中等差遵守機(jī)房規(guī)章制度上機(jī)時(shí)的表現(xiàn)學(xué)習(xí)態(tài)度程序準(zhǔn)備情況程序設(shè)計(jì)能力團(tuán)隊(duì)合作精神課題功能實(shí)現(xiàn)情況算法設(shè)計(jì)合理性用戶(hù)界面設(shè)計(jì)報(bào)告書(shū)寫(xiě)認(rèn)真程度內(nèi)容詳實(shí)程度文字表達(dá)熟練程度答復(fù)下列問(wèn)題準(zhǔn)確度簡(jiǎn) 短 評(píng) 語(yǔ)教師簽名:年月日評(píng)分等級(jí)備注評(píng)分等級(jí)有五種:優(yōu)秀、良好、中等、及格、不及格大整數(shù)階乘課題內(nèi)容和要求1、系統(tǒng)的根本功能及要求1寫(xiě)一個(gè)類(lèi)BigInte

2、ger,并有如下成員函數(shù)operator+/ operator-/ operator*/ operator,即整數(shù)的四則運(yùn)算并重載運(yùn)算符。2用該大整數(shù)計(jì)算n的階乘并顯示出來(lái)。n1,100注:為了簡(jiǎn)化,可不考慮負(fù)數(shù),則遇上形如“2-4這樣的表達(dá)式需要報(bào)錯(cuò)。2、程序執(zhí)行過(guò)程1系統(tǒng)從鍵盤(pán)讀入自然數(shù)n,直到輸入了合法的n為止。2輸出運(yùn)算的結(jié)果,為便于觀(guān)察結(jié)果,每輸出四位中間插入空格,格式如下例如,n=12:12!= 4790 0160 03詢(xún)問(wèn)用戶(hù)是否繼續(xù)進(jìn)展,用戶(hù)選擇“是,直到輸入合法為止,轉(zhuǎn)1,否則退出程序。3、算法要求及提示1因?yàn)閚較大時(shí),n!的結(jié)果將超出長(zhǎng)整形的保存*圍,因此結(jié)果不能用long

3、 int型的變量來(lái)保存。本算法要求用鏈表來(lái)存儲(chǔ)。2鏈表的每一個(gè)節(jié)點(diǎn)存儲(chǔ)結(jié)果的一位數(shù)字,因此結(jié)果的輸出實(shí)際上是鏈表的遍歷問(wèn)題,同時(shí)要先考慮用多少位來(lái)表示大整數(shù)。4、其他要求1輸入時(shí)具備一定的容錯(cuò)性判斷,如輸入的不是數(shù)字,或輸入的數(shù)超過(guò)*圍等等。2變量、函數(shù)命名符合規(guī)*。3注釋詳細(xì):每個(gè)變量都要求有注釋說(shuō)明用途;函數(shù)有注釋說(shuō)明功能,對(duì)參數(shù)、返回值也要以注釋的形式說(shuō)明用途;關(guān)鍵的語(yǔ)句段要求有注釋解釋。4程序的層次清晰,可讀性強(qiáng)。需求分析1課題要求已說(shuō)明結(jié)果不能用long int型的變量來(lái)保存,要求用鏈表來(lái)存儲(chǔ)。,首先要定義一個(gè)節(jié)點(diǎn)類(lèi),在這里定義一個(gè)雙向節(jié)點(diǎn)類(lèi)。2定義一個(gè)BigInteger大整數(shù)類(lèi),

4、使其能夠存放大數(shù)階乘,并實(shí)現(xiàn)其的四則運(yùn)算。3對(duì)輸入整數(shù)的合法性進(jìn)展檢查,必須考慮用戶(hù)各種輸入情況。三.概要設(shè)計(jì)1使用單鏈表存儲(chǔ)數(shù)據(jù),結(jié)點(diǎn)類(lèi)定義如下:class Node int data; Node* ne*t;/指向大數(shù)的高位 Node* pre;/指向大數(shù)的低位 friend class BigInteger;2.使用大整數(shù)類(lèi)來(lái)進(jìn)展大整數(shù)四則算法的重載,在主函數(shù)中通過(guò)定義大整數(shù)對(duì)象調(diào)用,大整數(shù)類(lèi)定義如下:class BigInteger/定義大整數(shù)類(lèi)public:Node *head,*head1;int n,temp,i,jinwei;BigInteger();/無(wú)參構(gòu)造函數(shù)BigInt

5、eger();/析構(gòu)函數(shù)void jiecheng();/階乘函數(shù)void operator +( BigInteger p1);/加法運(yùn)算重載聲明void operator -( BigInteger p1);/減法運(yùn)算重載聲明 void operator *( BigInteger p1);/乘法運(yùn)算重載聲明void operator /( BigInteger p1);/除法運(yùn)算重載聲明;3.算法設(shè)計(jì)說(shuō)明:因?yàn)閚較大時(shí),n!的結(jié)果將超出長(zhǎng)整形的保存*圍,因此結(jié)果不能用long int型的變量來(lái)保存。本算法數(shù)據(jù)用單鏈表來(lái)存儲(chǔ)。鏈表的每一個(gè)節(jié)點(diǎn)存儲(chǔ)結(jié)果的一位數(shù)字,因此結(jié)果的輸出實(shí)際上是鏈表的

6、遍歷問(wèn)題,同時(shí)要先考慮用多少位來(lái)表示大整數(shù)。首先申請(qǐng)一個(gè)結(jié)點(diǎn)類(lèi)并賦數(shù)據(jù)域初值1,然后遍歷單鏈表逐個(gè)的數(shù)據(jù)域與i1到n相乘;乘完后重新遍歷,對(duì)每個(gè)結(jié)點(diǎn)的數(shù)據(jù)域處理,假設(shè)小于10則跳過(guò);否則,判斷下一結(jié)點(diǎn)是否存在,假設(shè)存在則該數(shù)據(jù)域除10取余,下一結(jié)點(diǎn)的數(shù)據(jù)域加上該數(shù)據(jù)域除10的結(jié)果,假設(shè)不存在則申請(qǐng)新結(jié)點(diǎn)空間,處理同上;全部乘完并處理完后,遍歷單鏈表并輸出各自的數(shù)據(jù)域即可,注意每四個(gè)輸出一個(gè)空格。4、流程圖輸入n開(kāi)場(chǎng)N在1到100之間? 是 否計(jì)算n! 是是是否繼續(xù)?輸出n! 是完畢 否四.詳細(xì)設(shè)計(jì)1.階乘函數(shù)作為BigInteger類(lèi)中的函數(shù),在主函數(shù)通過(guò)定義大整數(shù)類(lèi)對(duì)象調(diào)用,階乘函數(shù)的定義如

7、下:void BigInteger:jiecheng()Node *cur,*cc;Node *head=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head-data=1; head-pre=head-ne*t=NULL;for(i=2;idata)+jinwei; cur-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur-ne*t=NULL) break; cur=cur-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必

8、須用 /while cc=new Node; cc-data=jinwei%10; cc-pre=cur; cc-ne*t=NULL; cur-ne*t=cc; cur=cc; jinwei/=10; coutnne*t)cur=cur-ne*t;/遍歷到最高位 while(cur)/從最高位到最低位打印 cc=cur; if(i=4) i=0; cout ; coutdata; cur=cur-pre; i+; delete cc; 2階乘加法函數(shù)的重載定義:void BigInteger:operator +( BigInteger p1)Node *cur,*cc,*cur1,*cc1;

9、head=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head-data=1; head-pre=head-ne*t=NULL;for(i=2;idata)+jinwei; cur-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur-ne*t=NULL) break; cur=cur-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc=new Node; cc-data=jinwei%10; cc-pre

10、=cur; cc-ne*t=NULL; cur-ne*t=cc; cur=cc; jinwei/=10; head1=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head1-data=1; head1-pre=head1-ne*t=NULL; for(i=2;idata)+jinwei; cur1-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur1-ne*t=NULL) break; cur1=cur1-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),

11、由于進(jìn)位可能是多位數(shù),所以必須用 /while cc1=new Node; cc1-data=jinwei%10; cc1-pre=cur1; cc1-ne*t=NULL; cur1-ne*t=cc1; cur1=cc1; jinwei/=10; if(np1.n)/假設(shè)this.n大于等于p1.ncur=head;cur1=head1;while(cur&cur1)/同時(shí)遍歷兩個(gè)單鏈表,其中有一個(gè)完畢就停頓遍歷cur-data+=cur1-data;/cur的數(shù)據(jù)域等于cur的數(shù)據(jù)域與cur1的數(shù)據(jù)域的和cur=cur-ne*t;cur1=cur1-ne*t;cur=head;/cur指向頭

12、結(jié)點(diǎn)do/利用階乘函數(shù)中的算法處理單鏈表各個(gè)節(jié)點(diǎn)的數(shù)據(jù)域if(cur-datadata=10)if(cur-ne*t)cur-ne*t-data+=cur-data/10;cur-data=cur-data%10;elseNode *q=new Node;q-ne*t=cur-ne*t;cur-ne*t=q;q-data+=cur-data/10;cur-data=cur-data%10;while(cur=cur-ne*t);cur=head,i=0; while(cur-ne*t)cur=cur-ne*t;/遍歷到最高位 while(cur)/從最高位到最低位打印 cc=cur; if(i

13、=4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur=cur-pre; i+; delete cc; elsecur=head;cur1=head1;while(cur&cur1)/同時(shí)遍歷兩個(gè)單鏈表,其中有一個(gè)完畢就停頓遍歷cur1-data+=cur-data;/cur1的數(shù)據(jù)域等于cur1的數(shù)據(jù)域與m的數(shù)據(jù)域的和cur1=cur1-ne*t;cur=cur-ne*t;cur1=head1;do/利用階乘函數(shù)中的算法處理單鏈表各個(gè)節(jié)點(diǎn)的數(shù)據(jù)域if(cur1-datadata=10)if(cur1-ne*t)cur1-ne*t-data+=cur1-data/10;

14、cur1-data=cur1-data%10;elseNode *q=new Node;q-data=0;q-ne*t=cur1-ne*t;cur1-ne*t=q;q-pre=cur1;q-data+=cur1-data/10;cur1-data=cur1-data%10;while(cur1=cur1-ne*t);cur1=head1,i=0; while(cur1-ne*t)cur1=cur1-ne*t;/遍歷到最高位 while(cur1)/從最高位到最低位打印 cc=cur1; if(i=4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur1=cur1-pre;

15、 i+; delete cc; 3階乘減法函數(shù)的重載定義:void BigInteger:operator -( BigInteger p1)if(n=p1.n)/假設(shè)this.n等于p1.ncoutdata=1; head-pre=head-ne*t=NULL;for(i=2;idata)+jinwei; cur-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur-ne*t=NULL) break; cur=cur-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必

16、須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc=new Node; cc-data=jinwei%10; cc-pre=cur; cc-ne*t=NULL; cur-ne*t=cc; cur=cc; jinwei/=10; head1=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head1-data=1; head1-pre=head1-ne*t=NULL; for(i=2;idata)+jinwei; cur1-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur1-ne*t=

17、NULL) break; cur1=cur1-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc1=new Node; cc1-data=jinwei%10; cc1-pre=cur1; cc1-ne*t=NULL; cur1-ne*t=cc1; cur1=cc1; jinwei/=10; if(np1.n)/假設(shè)this.n大于p1.n cur=head;cur1=head1;while(cur&cur1)/同時(shí)遍歷兩個(gè)單鏈表,其中有一個(gè)完畢就停頓遍歷cur-data-=cur1-data;cur=c

18、ur-ne*t;cur1=cur1-ne*t;cur=head;do/遍歷單鏈表if(cur-datane*t-data-=1;/p的后繼結(jié)點(diǎn)的數(shù)據(jù)域減1cur-data+=10;/p的數(shù)據(jù)域加10while(cur=cur-ne*t);cur=head,i=0; while(cur-ne*t)cur=cur-ne*t;/遍歷到最高位 while(cur)/從最高位到最低位打印 cc=cur; if(i=4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur=cur-pre; i+; delete cc; else cur=head;cur1=head1;while(cu

19、r&cur1)/同時(shí)遍歷兩個(gè)單鏈表,其中有一個(gè)完畢就停頓遍歷cur1-data-=cur-data;cur1=cur1-ne*t;cur=cur-ne*t;cur1=head1;do/遍歷單鏈表if(cur1-datane*t)/假設(shè)cur1的數(shù)據(jù)域小于0cur1-ne*t-data-=1;/cur1的后繼結(jié)點(diǎn)的數(shù)據(jù)域減1cur1-data+=10;/cur1的數(shù)據(jù)域加10while(cur1=cur1-ne*t);cur1=head1,i=0; while(cur1-ne*t)cur1=cur1-ne*t;/遍歷到最高位cout-;while(cur1)/從最高位到最低位打印 cc1=cur

20、1; if(i=4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur1=cur1-pre; i+; delete cc1;4階乘乘法函數(shù)重載的定義:void BigInteger:operator *( BigInteger p1)Node *cur,*cur1,*cc,*cc1;head=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head-data=1; head-pre=head-ne*t=NULL;for(i=2;idata)+jinwei; cur-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百

21、位作為進(jìn)位,取18為進(jìn)位 if(cur-ne*t=NULL) break; cur=cur-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc=new Node; cc-data=jinwei%10; cc-pre=cur; cc-ne*t=NULL; cur-ne*t=cc; cur=cc; jinwei/=10; for(i=1;idata)+jinwei; cur1-data=temp%10;/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為

22、進(jìn)位 if(cur1-ne*t=NULL) break; cur1=cur1-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc1=new Node; cc1-data=jinwei%10; cc1-pre=cur1; cc1-ne*t=NULL; cur1-ne*t=cc1; cur1=cc1; jinwei/=10; cur1=head,i=0; while(cur1-ne*t)cur1=cur1-ne*t;/遍歷到最高位 while(cur1)/從最高位到最低位打印 cc1=cur1; if(i=

23、4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur1=cur1-pre; i+; delete cc1; 5階乘除法函數(shù)重載的定義:void BigInteger:operator/(BigInteger p1)if(n=p1.n)/假設(shè)this.n等于p1.ncout1endl;elseif(np1.n)cout0p1.n)Node *cur,*cc;head=new Node;/存放第一個(gè)節(jié)點(diǎn),值為1 head-data=1; head-pre=head-ne*t=NULL;for(i=p1.n+1;idata)+jinwei; cur-data=temp%10;

24、/取個(gè)位存下來(lái),如91*2=182,取2存儲(chǔ) jinwei=temp/10;/十位和百位作為進(jìn)位,取18為進(jìn)位 if(cur-ne*t=NULL) break; cur=cur-ne*t; while(jinwei!=0)/如果乘完一個(gè)i發(fā)現(xiàn)還有進(jìn)位,就必須新增結(jié)點(diǎn),由于進(jìn)位可能是多位數(shù),所以必須用 /while cc=new Node; cc-data=jinwei%10; cc-pre=cur; cc-ne*t=NULL; cur-ne*t=cc; cur=cc; jinwei/=10; cur=head,i=0; while(cur-ne*t)cur=cur-ne*t;/遍歷到最高位 while(cur)/從最高位到最低位打印 cc=cur; if(i=4) /每輸出四個(gè)空一格 i=0; cout ; coutdata; cur=cur-pre; i+; delete cc; 五、數(shù)據(jù)測(cè)試及其結(jié)果分析數(shù)據(jù)測(cè)試測(cè)試界面:輸入錯(cuò)誤整數(shù):1230輸入正確整數(shù):12接著輸入y接著輸入5接著輸入n接著輸入6接著輸入52.結(jié)果分析:剛開(kāi)場(chǎng)運(yùn)行,程序首先提示用戶(hù)程序是計(jì)算大整數(shù)的階乘及其四則運(yùn)算的功能,并提示用戶(hù)按照輸入一個(gè)自然

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論