數(shù)據(jù)結(jié)構(gòu)大型實驗大整數(shù)運算系統(tǒng)(附源代碼)_第1頁
數(shù)據(jù)結(jié)構(gòu)大型實驗大整數(shù)運算系統(tǒng)(附源代碼)_第2頁
數(shù)據(jù)結(jié)構(gòu)大型實驗大整數(shù)運算系統(tǒng)(附源代碼)_第3頁
數(shù)據(jù)結(jié)構(gòu)大型實驗大整數(shù)運算系統(tǒng)(附源代碼)_第4頁
數(shù)據(jù)結(jié)構(gòu)大型實驗大整數(shù)運算系統(tǒng)(附源代碼)_第5頁
已閱讀5頁,還剩144頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)大型實驗實驗報告(附源代碼)浙江工業(yè)大學(xué)朱鎮(zhèn)洋 曹耀明 陳華族目錄第一部分 要求與概述 一、實驗?zāi)康囊约皽?zhǔn)備 第二部分 具體實現(xiàn) 一、代碼部分 二、程序流程及函數(shù)間關(guān)系三、實驗驗證分析四、調(diào)試分析五、附錄第一部分 要求與概述密碼學(xué)分為兩類密碼:對稱密碼和非對稱密碼。對稱密碼主要用于數(shù)據(jù)的加/解密,而非 對稱密碼則主要用于認(rèn)證、數(shù)字簽名等場合。非對稱密碼在加密和解密時,是把加密的 數(shù)據(jù)當(dāng)作一個大的正整數(shù)來處理,這樣就涉及到大整數(shù)的加、減、乘、除和指數(shù)運算等, 同時,還需要對大整數(shù)進行輸出。請采用相應(yīng)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)大整數(shù)的加、減、乘、除 和指數(shù)運算,以及大整數(shù)的輸入和輸出?;疽?要求采

2、用鏈表來實現(xiàn)大整數(shù)的存儲和運算,不允許使用標(biāo)準(zhǔn)模板類的鏈表類(list和函 數(shù)。同時要求可以從鍵盤輸入大整數(shù),也可以文件輸入大整數(shù),大整數(shù)可以輸出至顯示 器,也可以輸出至文件。大整數(shù)的存儲、運算和顯示,可以同時支持二進制和十進制, 但至少要支持十進制。大整數(shù)輸出顯示時,必須能清楚地表達出整數(shù)的位數(shù)。測試時, 各種¯況都需要測試,并附上測試截圖; 要求大整數(shù)的長度可以不受限制,即大整數(shù)的十進制位數(shù)不受限制,可以為十幾位的整 數(shù),也可以為500多位的整數(shù),甚至更長; 大整數(shù)的運算和顯示時,只需要考慮正的大整數(shù)。如果可能的話,請以秒為單位顯示每 次大整數(shù)運算的時間; 要求采用類的設(shè)計路,不

3、允許出現(xiàn)類以外的函數(shù)定義,但允許友元函數(shù)。主函數(shù)中只 能出現(xiàn)類的成員函數(shù)的調(diào)用,不允許出現(xiàn)對其它函數(shù)的調(diào)用。 要求采用多文件方式:.h 文件存儲類的聲明,.cpp 文件存儲類的實現(xiàn),主函數(shù)main 存儲在另外一個單獨的cpp 文件中。如果采用類模板,則類的聲明和實現(xiàn)都放在.h 文件 中; 要求源程序中有相應(yīng)注釋; 不強制要求采用類模板,也不要求采用可視化窗口; 要求測試?yán)右容^詳盡,各種極限¯況也要考慮到,測試的輸出信o要詳細(xì)易懂,表 明各個功能的執(zhí)行正確; 要求采用Visual C+ 6.0 及以上版本進行調(diào)試。設(shè)計思路 根據(jù)題目要求,用鏈表來實現(xiàn)大整數(shù)的存儲,用大整數(shù)類Long

4、_Num并實現(xiàn)一些基本操作,設(shè)計界面菜單類LN_menu來顯示界面;然后,在main函數(shù)中來完成各種操作與檢驗。第二部分 具體實現(xiàn)鏈表類及大數(shù)類的部分說明以及部分源碼鏈表類:List由使用指針連接的節(jié)點組成,每個節(jié)點都保存著數(shù)據(jù),以及指向前驅(qū) 和后繼的指針。每個節(jié)點中存儲一個數(shù)字表示大數(shù)的一位。源代碼:node:node(next=NULL;pre=NULL;node:node(int p /節(jié)點構(gòu)造函數(shù)value=p;next=NULL;pre=NULL;大數(shù)類: 大數(shù)類有一個頭節(jié)點和尾節(jié)點,分別為head和back ,而back的下一個節(jié)點為NULL。 當(dāng)head與back指向同一位置時表

5、示List為只含一個節(jié)點。Head與back都為NULL表示List為空。而且用一個int類型的變量存儲大數(shù)的長度,為以后的運算提供便利。構(gòu)造函數(shù):Long_Num:Long_Num( /構(gòu)造函數(shù)head=NULL;back=NULL;len=0;Long_Num(默認(rèn)構(gòu)造函數(shù)。void Long_Num:equal(Long_Num temp /復(fù)制構(gòu)造函數(shù),將形參復(fù)制給當(dāng)前對象,而非地址傳遞node*p=temp.head;len=temp.len;head=new node(p->value;back=head;p=p->next;while(pnode*Newnode=ne

6、w node(p->value;back->next=Newnode;Newnode->pre=back;back=back->next;p=p->next;void equal(Long_Num temp用equal代替了構(gòu)造函數(shù)。 void Long_Num:length( /更正對象長度并規(guī)范大整數(shù)node*p=head;int n_len=0;while(p->nextif(p->value=0p=p->next;head=head->next;head->pre=NULL;elsebreak;while(pn_len+;p=

7、p->next;len=n_len;void length(把大整數(shù)運算過后前面的0去掉,并且更正len長度。bool Long_Num:equalto(Long_Num temp /判斷兩大整數(shù)是否相等node*p1=head,*p2=temp.head;bool flag=true;while(flag&&p1if(p1->value!=p2->valueflag=false;elsep1=p1->next;p2=p2->next;return flag;void equalto(Long_Num temp判斷兩大整數(shù)是否相等void Long

8、_Num:print( /打印十進制數(shù)并存儲if(head=NULLcout<<"*數(shù)據(jù)為空!*"< elseofstream outfile;outfile.open("output_Num.txt",ios:app;node*p=head;while(p->nextif(p->value=0p=p->next;elsebreak;while(pcout< value; outfile< value; p=p->next;outfile< cout< void print(打印并存儲十進

9、制數(shù)據(jù)。void Long_Num:print2( /打印二進制數(shù)并存儲數(shù)據(jù)if(head=NULLcout<<"*數(shù)據(jù)為空!*"< elseofstream outfile;outfile.open("output2_Num.txt",ios:app;node*p=head;while(p->nextif(p->value=0p=p->next;elsebreak;while(pcout< value; outfile< value; p=p->next;outfile< cout< v

10、oid print2(打印并存儲二進制數(shù)據(jù)。bool Long_Num:compare(Long_Num temp /初級比較,只用于長度相等的大正間的比較,大于等于返回truebool flag=false;node*temp1=head,*temp2=temp.head;while(temp1if(temp1->value!=temp2->valueflag=temp1->value>temp2->value?true:false;break;elsetemp1=temp1->next;temp2=temp2->next;if(!temp1flag

11、=true;return flag;bool Long_Num:compare2(Long_Num temp /升級版比較,可比較長度的大整數(shù),大于等于返回trueif(len>temp.lenreturn true;elseif(len=temp.lenreturn compare(temp;elsereturn false;bool compare(Long_Num temp都是實現(xiàn)兩個大整數(shù)的比較。void Long_Num:set_Long_Num(string s /將輸入的字符串轉(zhuǎn)成大整數(shù)int str_len=s.length(;head=new node(ints0-48

12、;len+;back=head;if(str_len>1for(int i=1;i node*Newnode=new node(intsi-48;len+;back->next=Newnode;Newnode->pre=back;back=back->next;length(;void Long_Num:set_Long_Num2(int temp /建立大整數(shù),將參數(shù)建立新節(jié)點加在尾部node*Newnode=new node(temp;if(backback->next=Newnode;Newnode->pre=back;back=back->ne

13、xt;elsehead=Newnode;back=head;len+;void set_Long_Num(string s 創(chuàng)建大整數(shù),把字符串的內(nèi)容轉(zhuǎn)為int賦給大整數(shù)。void set_Long_Num2(int temp 如果當(dāng)前大整數(shù)為空,則創(chuàng)建大整數(shù),并把值賦給它,如果非空,則在后面添加節(jié)點,把值賦給節(jié)點。 Long_Num Long_Num:sub_Num(Long_Num temp,node* &p /截取一定長度,用于試商法Long_Num tempp;node*p1=head,*p2=temp.head;string s=""while(p2s+=

14、p1->value+'0'p1=p1->next;p2=p2->next;p=p->next;tempp.set_Long_Num(s;if(!pare(temp /如果截取的子串還是比參數(shù)小,再向后截一位p=p->next;tempp.set_Long_Num2(p1->value;tempp.length(;return tempp; Long_Num sub_Num(Long_Num temp,node* &p 截取被除數(shù)的字串,用于除法與除數(shù)的比較,如果小,則再截取后面一位。int Long_Num:result(Long_N

15、um temp /除法中的試商法得到當(dāng)前位的商length(;int result=0;while(compare2(tempdecrease(temp;result+;length(;return result;int result(Long_Num temp得到當(dāng)前大整數(shù)除以除數(shù)的商。實現(xiàn)思路:加法通過兩個操作數(shù)的每一位相加,滿10進位的思路設(shè)計。代碼實現(xiàn):Long_Num Long_Num:add(Long_Num temp /大整數(shù)加法if(temp.head=NULL|head=NULLcout<<"數(shù)據(jù)為空!"< 考慮數(shù)據(jù)的特殊情況 elsen

16、ode*temp1,*temp2;int i=0,j;if(len>temp.lentemp1=back; temp2=temp.back; /如果當(dāng)前大整數(shù)大于后一個,則temp1為長的最后一個節(jié)點for(;while(temp2!=NULLj=temp1->value+temp2->value+i; temp1->value=j%10; if(j>=10i=1;elsei=0;temp2=temp2->pre;temp1=temp1->pre; /在短的那個數(shù)還沒有遍歷完的情況下,實現(xiàn)每一位的加法,設(shè)置一個i變量,默認(rèn)設(shè)為0。如果滿10則設(shè)為1,并

17、在前一位加上,否則設(shè)為0。if(temp1=NULLif(i=1node*Newnode=new node(1;Newnode->next=head;head->pre=Newnode;head=head->pre;break;elsebreak; /如果到了長的那個數(shù)的頭一位,而i仍為1,則在大整數(shù)的前面添加值1的節(jié)點。if(temp1!=NULLj=temp1->value+i;temp1->value=j%10;if(j>=10i=1;elsei=0;temp1=temp1->pre; /如果還沒到長的那個數(shù)的頭一個,執(zhí)行i與當(dāng)前數(shù)的加法,如果滿

18、10則i為1,否則i為0。length(; return *this; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回長的那個對象。if(len=temp.leni=0;temp1=back;temp2=temp.back;while(temp1->pre!=NULLj=temp1->value+temp2->value+i;if(j>=10temp1->value=j%10;i=1;elsetemp1->value=j;i=0;temp2=temp2->pre;temp1=temp1->pre;j=temp1->value

19、+temp2->value+i; /兩個大整數(shù)位數(shù)相同,每一位都相加,滿10進1。if(j>=10temp1->value=j%10;node*Newnode=new node(1;head->pre=Newnode;Newnode->next=head;head=head->pre;elsetemp1->value=j; /到了頭一位時,如果i為1,則在大整數(shù)前面添加值為1的節(jié)點。length(;return *this;if(len temp1=temp.back;temp2=back;for(;while(temp2!=NULLj=temp1-&

20、gt;value+temp2->value+i;temp1->value=j%10;if(j>=10i=1;elsei=0;temp2=temp2->pre;temp1=temp1->pre; /在短的那個數(shù)還沒有遍歷完的情況下,實現(xiàn)每一位的加法,設(shè)置一個i變量,默認(rèn)設(shè)為0。如果滿10則設(shè)為1,并在前一位加上,否則設(shè)為0。if(temp1=NULLif(i=1node*Newnode=new node(1;Newnode->next=temp.head;temp.head->pre=Newnode;temp.head=temp.head->pre

21、;break;elsebreak;if(temp1!=NULLj=temp1->value+i;temp1->value=j%10;if(j>=10i=1;elsei=0;temp1=temp1->pre; /如果還沒到長的那個數(shù)的頭一個,執(zhí)行i與當(dāng)前數(shù)的加法,如果滿10則i為1,否則i為0。equal(temp;length(;return *this; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回長的那個對象。實現(xiàn)思路:減法通過兩個操作數(shù)每一位相減,不夠則借位的思路設(shè)計。代碼實現(xiàn):Long_Num Long_Num:decrease(Long_Nu

22、m temp /大整數(shù)減法if(head=NULL|temp.head=NULLcout<<"數(shù)據(jù)為空!"< 考慮數(shù)據(jù)的特殊情況 elsenode*temp1,*temp2;int i=0,j;if(len>temp.lentemp1=back;temp2=temp.back;while(temp1while(temp2!=NULLj=temp1->value-temp2->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->

23、;pre;temp2=temp2->pre; /在短的那個數(shù)還沒有遍歷完的情況下,實現(xiàn)每一位的減法,設(shè)置一個i變量,默認(rèn)設(shè)為0。如果不夠則設(shè)為1,并在前一位減去,否則設(shè)為0。j=temp1->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->pre; /如果還沒到長的那個數(shù)的頭一個,執(zhí)行i與當(dāng)前數(shù)的減法,如果不夠則i為1,否則i為0。length(;return *this; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回長的那個對象。if(len=

24、temp.lenint i=0,j;node*temp1,*temp2;if(compare(tempif(equalto(tempset_Long_Num("0"return *this; /兩個大整數(shù)相等則直接返回0elsetemp1=back;temp2=temp.back;while(temp1j=temp1->value-temp2->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->pre;temp2=temp2->pre; /

25、 兩個大整數(shù)位數(shù)相同,每一位都相減,不夠則把i=1,在前面一位減的時候減去,再把i=0,否則就i=0。length(;return *this; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回長的那個對象。elseLong_Num tempp;tempp.equal(temp;temp1=tempp.back;temp2=back;while(temp1j=temp1->value-temp2->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->pr

26、e;temp2=temp2->pre;equal(tempp;length(;return *this;if(len Long_Num tempp;tempp.equal(temp;temp1=tempp.back;temp2=back;while(temp1while(temp2!=NULLj=temp1->value-temp2->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->pre;temp2=temp2->pre; /在短的那個數(shù)還沒有遍歷完

27、的情況下,實現(xiàn)每一位的減法,但是用長的那個減去短的那個,設(shè)置一個i變量,默認(rèn)設(shè)為0。如果不夠則設(shè)為1,并在前一位減去,否則設(shè)為0。j=temp1->value-i;if(j<0temp1->value=j+10;i=1;elsetemp1->value=j;i=0;temp1=temp1->pre; /如果還沒到長的那個數(shù)的頭一個,執(zhí)行i與當(dāng)前數(shù)的減法,用長的那個數(shù)減短的,如果不夠則i為1,否則i為0。equal(tempp;length(;return *this; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回長的那個對象。實驗思路:乘法通過一

28、個操作數(shù)的每一位分別于另一個操作數(shù)的每一位相乘,得到的結(jié)果再相加設(shè)計。代碼實現(xiàn):Long_Num Long_Num:change( /刪除頭尾節(jié)點(乘法專用)node*p1=head->next;node*p2=head;while(p1->next!=NULLp2->value=p1->value;p1=p1->next;p2=p2->next;node*p=back;p->pre->next=NULL;back=p->pre;p->pre=NULL;p=back;p->pre->next=NULL;back=p->

29、;pre;p->pre=NULL;return *this; /刪除乘法一開始創(chuàng)建的頭尾兩個節(jié)點,并重新定義頭尾節(jié)點。 Long_Num multiply(Long_Num tempp,Long_Num temps /大整數(shù)乘法Long_Num sum,ex,cx;ex.head=new node(0;ex.len+;ex.back=ex.head;sum.head=new node(0;sum.len+;sum.back=sum.head;cx.head=new node(0;cx.len+;cx.back=cx.head;node*temp1,*temp2,*tempt;temp1=

30、tempp.back;temp2=temps.back; for(int w=0;temp2!=NULL;w+ /設(shè)置w變量,從0循環(huán)到第二個大整數(shù)的長度。Long_Num l;int i=0,j;l.head=new node(0;l.back=new node(0;l.head->next=l.back;l.back->pre=l.head;tempt=l.back; /先創(chuàng)建一個大整數(shù)l,頭尾結(jié)點分別為0。for(;while(temp1!=NULLj=temp1->value*temp2->value+i;i=j/10;temp1=temp1->pre;

31、node*Newnode=new node(;Newnode->pre=l.head;Newnode->next=l.head->next;tempt->pre=Newnode;l.head->next=Newnode;tempt=tempt->pre;tempt->value=j%10;l.len+; /把一個大整數(shù)的每一位乘以另一個大整數(shù)的第一位,設(shè)置i=0,結(jié)果加上i除以10,商賦給當(dāng)前值,余數(shù)賦給i,把當(dāng)前值插入到l的頭結(jié)點后,l的長度加1。for(int ww=0;ww node*Newnode=new node(0;l.back->n

32、ext=Newnode;Newnode->pre=l.back;l.back=Newnode;l.len+; /當(dāng)一個大整數(shù)的每一位乘完以后,把另一個大整數(shù)的位數(shù)往前移一位,并且移動一次,要在l后面添加一個值為0的節(jié)點,并且l的長度加1。if(temp1=NULLif(i!=0node*Newnode=new node(i;Newnode->next=l.head->next;l.head->next->pre=Newnode;l.head->next=Newnode;Newnode->pre=l.head;l.len+; /當(dāng)?shù)竭_第一個大整數(shù)的頭一位

33、時i仍不為0,則在l的頭結(jié)點后面插入值為i的節(jié)點,并且l的長度加1。temp1=tempp.back;temp2=temp2->pre;ex.len=l.len-2;ex=l.change(; /去掉原先創(chuàng)建的頭尾兩個值為0的節(jié)點,長度減2。cx=sum;cx.len=sum.len;sum=cx.add2(ex; break; sum.len+;sum.length(; return sum; /把第一個不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,并返回。實驗思路:除法通過先在被除數(shù)中取跟除數(shù)一樣的位數(shù),進行不斷的減法操作,直至小于除數(shù),然后再向后面取數(shù)直至位數(shù)于除數(shù)相同,重復(fù)。代碼

34、實現(xiàn):int Long_Num:result(Long_Num temp /除法中的試商法得到當(dāng)前位的商length(;int result=0;while(compare2(tempdecrease(temp;result+;length(;return result;void Long_Num:set_Long_Num2(int temp /建立大整數(shù),將參數(shù)建立新節(jié)點加在尾部node*Newnode=new node(temp;if(backback->next=Newnode;Newnode->pre=back;back=back->next;elsehead=New

35、node;back=head;len+;Long_Num Long_Num:sub_Num(Long_Num temp,node* &p /截取一定長度,用于試商法Long_Num tempp;node*p1=head,*p2=temp.head;string s=""while(p2s+=p1->value+'0'p1=p1->next;p2=p2->next;p=p->next;tempp.set_Long_Num(s;if(!pare(temp /如果截取的子串還是比參數(shù)小,再向后截一位p=p->next;temp

36、p.set_Long_Num2(p1->value;tempp.length(;return tempp;Long_Num Long_Num:divide(Long_Num temp1,Long_Num& temp2 /大整數(shù)除法string s_result=""int sh;Long_Num temp;if(compare2(temp1if(len>temp1.lennode*curren=head;temp=sub_Num(temp1,curren; / 當(dāng)被除數(shù)位數(shù)比除數(shù)大,先創(chuàng)建一個大整數(shù)temp,存儲在被除數(shù)上截取除數(shù)長度的一段值,如果不夠大

37、,則往后面再截取一位。sh=temp.result(temp1; /sh為一次除法得到的商,temp為得到的余數(shù)s_result+=sh+'0' /創(chuàng)建一個字符串s,來累加商while(currentemp.set_Long_Num2(curren->value;sh=temp.result(temp1; s_result+=sh+'0'curren=curren->next; /余數(shù)加上后一位的值構(gòu)成大整數(shù)除以除數(shù),如果比除數(shù)小則s加上0,否則s加上商,重復(fù)直至最后。temp2.equal(temp;set_Long_Num(s_result;le

38、ngth(;return *this; /返回字符串s為總的商,把余數(shù)賦給第二個大整數(shù)參數(shù)elsesh=result(temp1;s_result+=sh+'0'temp2.equal(*this;set_Long_Num(s_result;length(;return *this; /當(dāng)被除數(shù)位數(shù)和除數(shù)相同,如上進行一次除法操作。 elsetemp2.equal(*this;set_Long_Num("0"return *this; /當(dāng)被除數(shù)位數(shù)比除數(shù)小,就直接返回s為0,余數(shù)為被除數(shù).實驗思路:冪運算則通過底數(shù)自乘,冪減1,結(jié)合加法,乘法,減法的方法實

39、現(xiàn)。代碼實現(xiàn):bool If_one(Long_Num temp /判斷對象是為1bool flag=false;node*p=temp.back;if(p->value!=1return flag;elsep=p->pre;flag=true;while(pif(p->value!=0flag=false;break;elsep=p->pre;return flag;bool If_zero(Long_Num temp /判斷對象是否為0bool flag=false;node*p=temp.back;if(p->value!=0return flag;else

40、p=p->pre;flag=true;while(pif(p->value!=0flag=false;break;elsep=p->pre;return flag;Long_Num Long_Num:power(Long_Num temp /大整數(shù)乘方Long_Num sum,tempp,one;one.set_Long_Num("1"tempp.equal(temp;sum.equal(*this;if(If_one(temppsum.length(;return sum; /指數(shù)為1則直接返回底數(shù)elseif(If_zero(temppreturn o

41、ne; /指數(shù)為0則直接返回0elsewhile(!If_one(temppsum=multiply(sum,*this;tempp=tempp.decrease(one; /底數(shù)自乘,指數(shù)減1,直至指數(shù)為1。sum.length(;return sum;實驗思路:十進制轉(zhuǎn)二進制則通過不斷除二,取余放入棧中,再輸出的方法實現(xiàn)。二進制轉(zhuǎn)十進制則通過每一位乘以2(n-1再相加的方法實現(xiàn)。代碼實現(xiàn):十進制轉(zhuǎn)二進制Long_Num Long_Num:tranform1( /十進制轉(zhuǎn)二進制if(If_one(*this|If_zero(*thisreturn *this; / 如果當(dāng)前值為0或1則直接返

42、回。elsestack st; Long_Num yushu,two;two.set_Long_Num("2"while(!If_one(*thisdivide(two,yushu;st.push(yushu.get_value(; /商不斷除2,把余數(shù)放入棧中,直到商為1。set_Long_Num("1"while(!st.empty(set_Long_Num2(st.top(;st.pop(; /把棧中的元素輸出,就為二進制。return *this;二進制轉(zhuǎn)十進制Long_Num Long_Num:tranform2( /二進制轉(zhuǎn)十進制if(len

43、=0cout<<"*數(shù)據(jù)為空!"< 如果長度為 0 ,數(shù)據(jù)為空。 if(len=1if(head->value=0set_Long_Num("0"return *this;elseset_Long_Num("1"return *this; /如果長度為1,直接輸出。if(len>1Long_Num cx,sum,ex,one;sum.set_Long_Num("0"one.set_Long_Num("1"cx.set_Long_Num("2"in

44、t t_len=len-1,t;node*p=head;while(p->nextif(p->value=1string s=""s=t_len+'0'ex.set_Long_Num(s;sum.add(cx.power(ex;t_len-;p=p->next; /每一位乘以2(n-1,相加,直到最后一位。if(p->value=1sum.add(one; /如果最后一位為1,則再加1。equal(sum;return *this;加法調(diào)用length函數(shù),equal函數(shù)。減法調(diào)用length函數(shù),compare函數(shù),equal函數(shù),

45、equalto函數(shù),set_Long_Num函數(shù)。乘法調(diào)用change函數(shù),add函數(shù),length函數(shù)。除法調(diào)用compare函數(shù),comepare2函數(shù),sub_Num函數(shù),result函數(shù),set_Long_Num2函數(shù),set_Long_Num函數(shù),equal函數(shù),length函數(shù),decrease函數(shù)。冪運算調(diào)用set_Long_Num函數(shù),equal函數(shù),length函數(shù),If_one函數(shù) ,If_zero函數(shù),multiply函數(shù),decrease函數(shù)。十進制轉(zhuǎn)二進制調(diào)用If_one函數(shù) ,If_zero函數(shù),set_Long_Num函數(shù),divide函數(shù),get_value函數(shù)

46、,set_Long_Num2函數(shù)。二進制轉(zhuǎn)十進制調(diào)用set_Long_Num函數(shù),add函數(shù),power函數(shù),equal函數(shù)。理論上可輸入無限大的數(shù)程序會出現(xiàn)菜單,輸入的形式需跟菜單一致。只能輸入正數(shù)。支持十進制和二進制。鍵盤輸入:文件讀入: 指令識別 讀寫文本 檢查錯誤 算式運算 輸出結(jié)果正確輸入:錯誤輸入:一開始創(chuàng)建鏈表是只有向后的一個指針,結(jié)果在寫運算時發(fā)現(xiàn)很不方便,所以后面把它改成了雙向鏈表。一開始寫除法時,采取了重復(fù)減法的方法,結(jié)果發(fā)現(xiàn)時間復(fù)雜度較高,運算時間太長,后來就采取另外算法。運算后前面有0殘留的問題,后面又寫了一個length把長度更正和去0的的功能,就能正確的輸出了。一開

47、始把兩個大整數(shù)直接用等號相等,結(jié)果出現(xiàn)了錯誤。兩個大整數(shù)直接用等號相等為地址傳遞,若一個改變,另一個也會改變。后來寫了一個equal函數(shù),僅僅把一個大整數(shù)的每個值傳給另一個大整數(shù)。一開始發(fā)現(xiàn)結(jié)果不對,但是找了好久也不知道哪里錯誤。后面發(fā)現(xiàn)因為在運算的時候len沒有改變,導(dǎo)致在條件判斷中出錯。一開始在寫length函數(shù)時僅僅移動了head節(jié)點,而沒有head節(jié)點的pre指針設(shè)為NULL,導(dǎo)致有些運算通過back往前移的時候又出現(xiàn)了0,結(jié)果錯誤。node.h#ifndef NODE_H#define NODE_Hclass nodepublic:node(;node(int p;int value

48、;node*next;node*pre;#endiflong_num.h#ifndef LONG_NUM#define LONG_NUM#include"node.h"#include #include using namespace std;class Long_Numprivate:node*head;node*back;int len;public:Long_Num(;void length(; /更正一個數(shù)的長度bool equalto(Long_Num temp; /判斷兩個數(shù)是否相等void equal(Long_Num temp; /復(fù)制函數(shù)void prin

49、t(; /打印并存儲數(shù)據(jù)void print2(; /打印并存儲二進制數(shù)據(jù)friend bool If_one(Long_Num temp; /判斷是否為1friend bool If_zero(Long_Num temp; /判斷是否為0bool compare(Long_Num temp; /比較長度相等的兩數(shù)void set_Long_Num(string s; /建立大整數(shù)void set_Long_Num2(int temp; /建立大整數(shù)2Long_Num add(Long_Num temp; /加法Long_Num add2(Long_Num temp; /加法2(乘法專用)Lo

50、ng_Num decrease(Long_Num temp; /減法Long_Num change(; /除去乘法計算中的頭尾節(jié)點(乘法專用)friend Long_Num multiply(Long_Num tempp,Long_Num temps; /友元乘法Long_Num divide(Long_Num temp1,Long_Num& temp2; /除法Long_Num power(Long_Num temp; /乘方Long_Num tranform1(; /十進制轉(zhuǎn)二進制Long_Num tranform2(; /二進制轉(zhuǎn)十進制bool If_even(; /判斷是否為偶

51、數(shù)Long_Num sub_Num(Long_Num temp,node* &p; /截取子串(除法專用)int result(Long_Num temp; /試商法獲取子串的商(除法專用)bool compare2(Long_Num temp; /compare函數(shù)的更新,可比較長度不等的大整數(shù)int get_value(; /返回節(jié)點數(shù)值(除法專用);#endifd_timer.h#ifndef TIMER_CLASS#define TIMER_CLASS#include / declares clock_t type, function clock(, / and constan

52、t CLOCKS_PER_SECclass timerprivate:/ starting and ending time measured in clock ticksclock_t startTime, endTime;public:timer(;/ initialize the timer./ Postconditions: set the starting and ending event times to 0./ this creates an event whose time is 0.0void start(;/ start timing an event./ Postcondi

53、tion: record the current time as the starting timevoid stop(;/ stop timing an event./ Postconditon: record the current time as the ending timedouble time( const;/ return the time the event took in seconds by computing/ the difference between the ending and starting times.;/ */ timer class implementa

54、tion/ */ constructor. set starting and ending times to 0timer:timer(:startTime(0, endTime(0/ determine clock ticks at startvoid timer:start(startTime = clock(;/ determine clock ticks at endvoid timer:stop(endTime = clock(;/ return the elapsed time in secondsdouble timer:time( constreturn (endTime-st

55、artTime/double(CLOCKS_PER_SEC;#endif / TIMER_CLASSLN_Menu.h#include #include #include #include #include"d_timer.h"#include void print_menu1( /打印界面函數(shù)system("CLS"cout<<" |"< cout<<" |"<<'004'<<" "<<"大整數(shù)運算系統(tǒng)

56、 004 |"< cout<<" | |"< cout<<" | |"< cout<<" | "<<'020'<<" "<<"1:十進制運算 |"< cout<<" | |"< cout<<" | |"< cout<<" | |"< cout<<" | "<<'020'<<" "<<"2:二進制運算 |"< cout<<" | |"< cout<<" | |"< cout<<" | |"< cout<<" | "<<'020'<<" &

溫馨提示

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

評論

0/150

提交評論