大數(shù)運(yùn)算器程序設(shè)計文檔(共16頁)_第1頁
大數(shù)運(yùn)算器程序設(shè)計文檔(共16頁)_第2頁
大數(shù)運(yùn)算器程序設(shè)計文檔(共16頁)_第3頁
大數(shù)運(yùn)算器程序設(shè)計文檔(共16頁)_第4頁
大數(shù)運(yùn)算器程序設(shè)計文檔(共16頁)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 韶關(guān)學(xué)院(xuyun)計算機(jī)科學(xué)學(xué)院數(shù)據(jù)結(jié)構(gòu)(sh j ji u)課程設(shè)計題 目:大數(shù)(d sh)運(yùn)算器學(xué)生姓名:學(xué) 號:專 業(yè):班 級: 指導(dǎo)教師姓名及職稱: 講師 起止時間: 年 月 年 月1.需求(xqi)分析1.1課題(kt)背景及意義大數(shù)運(yùn)算,顧名思義,就是很大的數(shù)值(shz)的數(shù)進(jìn)行一系列的運(yùn)算。隨著社會的發(fā)展,數(shù)據(jù)出現(xiàn)了指數(shù)般爆炸性增長,而在天文學(xué),數(shù)學(xué),遺傳學(xué)等傳統(tǒng)學(xué)科,所研究的數(shù)字往往幾百位甚至上千位,要求的精度也很高。但是在計算機(jī)中,由于字長的限制,計算機(jī)所能表示的范圍是有限的,當(dāng)我們對比較小的數(shù)進(jìn)行運(yùn)算時,這樣的數(shù)值并沒有超出計算機(jī)的表示范圍,所以可以運(yùn)算。但是當(dāng)我們在

2、實(shí)際的應(yīng)用中進(jìn)行大量的數(shù)據(jù)處理時,會發(fā)現(xiàn)參與運(yùn)算的數(shù)往往超過計算機(jī)的基本數(shù)據(jù)類型的表示范圍,比如在天文學(xué)時常運(yùn)用到的“光年”這一單位,如果求距地球幾十光年的星球航天器所要到達(dá)的時間,計算機(jī)將無法對其進(jìn)行運(yùn)算。由于 HYPERLINK /view/3281.htm t /_blank 編程語言提供的基本數(shù)值數(shù)據(jù)類型表示的數(shù)值范圍有限,不能滿足較大規(guī)模的高精度數(shù)值計算,因此需要利用其他方法實(shí)現(xiàn)高精度數(shù)值的計算,于是產(chǎn)生了大數(shù)運(yùn)算。大數(shù)運(yùn)算主要有加、減、乘三種方法。既然在計算機(jī)中無法直接表示,那么大數(shù)到底如何進(jìn)行運(yùn)算呢,學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的都知道線性表,將大數(shù)拆分然后存儲在線性表中,不失為一個很好的辦法

3、。1.2課題要求基本要求: 實(shí)現(xiàn)一個大整數(shù)(要求允許絕對值232)的運(yùn)算程序。要求程序讀入操作數(shù)A和B,選擇相應(yīng)的加、減法或乘法運(yùn)算符,然后計算結(jié)果并輸出到屏幕上。選做內(nèi)容:(1)實(shí)現(xiàn)整除運(yùn)算; (2)求出運(yùn)算時間; (3)實(shí)現(xiàn)乘方運(yùn)算; (4)圖形化操作界面。1.2.1程序規(guī)定格式(1)輸入的形式:正數(shù)的不同輸入符號位,輸入數(shù)為整型數(shù),數(shù)位理論上為無限位。(2)程序所能達(dá)到的功能:能進(jìn)行理論上無限位的數(shù)值之間所有整型數(shù)的四則運(yùn)算。(3)輸出(shch)的形式:整型數(shù)據(jù)1.2.2測試(csh)的數(shù)據(jù)(1)正確(zhngqu)的輸入以下是對兩個大數(shù)進(jìn)行加減乘運(yùn)算所得的正確結(jié)果:大數(shù)A:99988

4、8777666555444333222111000大數(shù)B:111222333444555666777888999000正確的運(yùn)算結(jié)果:A+B:1111111111111111111111111110000A-B:888666444221999777555333112000A*B:111209963037098814851876554444456814851901296370456889000000以下是對兩個大數(shù)進(jìn)行除法運(yùn)算所得的正確結(jié)果:大數(shù)A:999888777666555444333222111000大數(shù)B:1234567890正確的運(yùn)算結(jié)果A/B:8099099172800901571

5、58(2)錯誤的輸入數(shù)A:999999999999.9數(shù)B:3錯誤的結(jié)果:33333333333332概要設(shè)計2.1問題解決的思路概述 首先是確定結(jié)構(gòu)化程序設(shè)計的流程圖,利用字符串來進(jìn)行比較數(shù)的大小,把程序主要分為五個部分:實(shí)現(xiàn)加法的模塊,實(shí)現(xiàn)減法的模塊,實(shí)現(xiàn)乘法的模塊,實(shí)現(xiàn)除法的模塊,實(shí)現(xiàn)求余的模塊,通過函數(shù)的嵌套調(diào)用來實(shí)現(xiàn)其功能,并通過編寫main主函數(shù)來實(shí)現(xiàn)大整數(shù)的正確輸入與正確輸出,最后通過調(diào)試程序來修改不足和優(yōu)化程序界面。2.2相關(guān)函數(shù)的的介紹與說明int sign=1; /sign 為符號位inline int compare(string str1,string str2)/定義

6、比較兩個函數(shù)(hnsh)大小string ADD_INT(string str1,string str2) /加法(jif)string:size_type L1,L2;/定義(dngy)L1,L2的類型int int1=0,int2=0; /int2 記錄進(jìn)位string:size_type tempint;/自定義tempintstring MUL_INT(string str1,string str2)/高精度乘法string DIVIDE_INT(string str1,string str2,int flag) /除法,flag=1時,返回商; flag=0時,返回余數(shù)string

7、quotient,residue; /定義商和余數(shù)string tempstr/字符串變量string DIV_INT(string str1,string str2) return DIVIDE_INT(str1,str2,1);/除法,返回商string MOD_INT(string str1,string str2) return DIVIDE_INT(str1,str2,0);/除法,返回余數(shù)printf()/顯示內(nèi)容2.3主程序的流程圖main()選擇運(yùn)算符號(+,-,*,/,%)從界面獲取大數(shù)數(shù)據(jù)將字符型大數(shù)轉(zhuǎn)換成所定義結(jié)構(gòu)類型大數(shù)調(diào)用相應(yīng)的運(yùn)算代碼進(jìn)行運(yùn)算將返回的運(yùn)算結(jié)果轉(zhuǎn)換成字

8、符類型數(shù)據(jù)輸出運(yùn)算結(jié)果結(jié)束3調(diào)試(dio sh)分析4用戶使用(shyng)說明程序運(yùn)行操作步驟:運(yùn)行(ynxng)66666.exe應(yīng)用程序后出現(xiàn)主界面;首先,按下數(shù)字鍵輸入數(shù)A,按下回車鍵。在輸入數(shù)的過程中,如果發(fā)現(xiàn)輸入的某個數(shù)錯誤了,可按“退格”鍵從后往前一個個刪除掉;(3)輸入將要(jingyo)運(yùn)算的運(yùn)算符,如“加”是“+”,“減”是“-”,“乘”是“*”,“除”是“/”,“求余”是“%”;(4)輸入數(shù)B,按下回車鍵,結(jié)果就會顯示(xinsh)在屏幕上。5測試(csh)結(jié)果 圖1程序主界面 圖2加法(jif)測試結(jié)果 圖3減法測試(csh)結(jié)果 圖4乘法(chngf)測試結(jié)果 圖5除

9、法(chf)測試結(jié)果參考文獻(xiàn)1嚴(yán)蔚敏,李冬梅,吳偉民 .數(shù)據(jù)結(jié)構(gòu)(sh j ji u)(C語言版) M.北京:人民郵電出版社,2011.2譚浩強(qiáng) .C+面向?qū)ο蟪绦蛟O(shè)計(chn x sh j)(第二版) M.北京:中國鐵道出版社,2009.附錄(fl):程序源碼#include #include using namespace std;inline int compare(string str1,string str2) /相等返回0,大于返回1,小于返回-1 if (str1.size()str2.size() return 1; /長度長的整數(shù)大于長度小的整數(shù) else if (str1.

10、size()str2.size() return -1; else return pare(str2); /若長度相等,則頭到尾按位比較string SUB_INT(string str1,string str2);string ADD_INT(string str1,string str2) /高精度加法 int sign=1; /sign 為符號位 string str; if (str10=-) if (str20=-) sign=-1; str=ADD_INT(str1.erase(0,1),str2.erase(0,1); else str=SUB_INT(str2,str1.era

11、se(0,1); else if (str20=-) str=SUB_INT(str1,str2.erase(0,1); else /把兩個整數(shù)(zhngsh)對齊,短整數(shù)前面加0補(bǔ)齊 string:size_type L1,L2; int i; L1=str1.size(); L2=str2.size(); if (L1L2) for (i=1;i=L2-L1;i+) str1=0+str1; else for (i=1;i=0;i-) int1=(int(str1i)-0+int(str2i)-0+int2)%10; int2=(int(str1i)-0+int(str2i)-0+int2

12、)/10; str=char(int1+0)+str; if (int2!=0) str=char(int2+0)+str; /運(yùn)算(yn sun)后處理符號位 if (sign=-1)&(str0!=0) str=-+str; return str;string SUB_INT(string str1,string str2) /高精度減法 int sign=1; /sign 為符號位 string str; int i,j; if (str20=-) str=ADD_INT(str1,str2.erase(0,1); else int res=compare(str1,str2); if

13、(res=0) return 0; if (res=0;i-) if (str1i+tempint=0;i-) str=str1i+str; /去除(q ch)結(jié)果中多余的前導(dǎo)0 str.erase(0,str.find_first_not_of(0); if (str.empty() str=0; if (sign=-1) & (str0!=0) str =-+str; return str;string MUL_INT(string str1,string str2) /高精度乘法(chngf) int sign=1; /sign 為符號(fho)位 string str; if (str

14、10=-) sign*=-1; str1 =str1.erase(0,1); if (str20=-) sign*=-1; str2 =str2.erase(0,1); int i,j; string:size_type L1,L2; L1=str1.size(); L2=str2.size(); for (i=L2-1;i=0;i-) /模擬手工乘法豎式 string tempstr; int int1=0,int2=0,int3=int(str2i)-0; if (int3!=0) for (j=1;j=0;j-) int1=(int3*(int(str1j)-0)+int2)%10; i

15、nt2=(int3*(int(str1j)-0)+int2)/10; tempstr=char(int1+0)+tempstr; if (int2!=0) tempstr=char(int2+0)+tempstr; str=ADD_INT(str,tempstr); /去除結(jié)果(ji gu)中的前導(dǎo)0 str.erase(0,str.find_first_not_of(0); if (str.empty() str=0; if (sign=-1) & (str0!=0) str=-+str; return str;string DIVIDE_INT(string str1,string str

16、2,int flag) /高精度除法。flag=1時,返回(fnhu)商; flag=0時,返回余數(shù) string quotient,residue; /定義(dngy)商和余數(shù) int sign1=1,sign2=1; if (str2 = 0) /判斷除數(shù)是否為0 quotient= ERROR!; residue = ERROR!; if (flag=1) return quotient; else return residue ; if (str1=0) /判斷被除數(shù)是否為0 quotient=0; residue =0; if (str10=-) str1 = str1.erase(

17、0,1); sign1 *= -1; sign2 = -1; if (str20=-) str2 = str2.erase(0,1); sign1 *= -1; int res=compare(str1,str2); if (res0) quotient=0; residue =str1; else if (res = 0) quotient=1; residue =0; else string:size_type L1,L2; L1=str1.size(); L2=str2.size(); string tempstr; tempstr.append(str1,0,L2-1); for (int i=L2-1;i=0;ch-) /試商 string str; str=str+ch; if (compare(MUL_INT(str2,str),tempstr)s1chs2) switch (ch) case +:res=ADD_INT(s1,s2);break; case _:res=SUB_INT(s1,s2);break;

溫馨提示

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

評論

0/150

提交評論