版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)大型實(shí)驗(yàn)實(shí)驗(yàn)報(bào)告(大整數(shù)運(yùn)算)
主要負(fù)責(zé)人:朱鎮(zhèn)洋
參與者:曹耀明陳華族
目錄
第一部分要求與概述
一、實(shí)驗(yàn)?zāi)康囊约皽?zhǔn)備
1.1.1問題描述.........................................................
1.1.2基本要求.........................................................
1.1.3設(shè)計(jì)思路.........................................................
第二部分具體實(shí)現(xiàn)
一、代碼部分
2.1.1鏈表類及大數(shù)類的部分說明以及部分源碼.............................
2.1.2部分簡單函數(shù)功能..................................................
2.1.3加法...............................................................
2.1.4減法...............................................................
2.1.5乘法...............................................................
2.1.6除法...............................................................
2.1.7基運(yùn)算.............................................................
2.1.8二進(jìn)制和十進(jìn)制的相互轉(zhuǎn)化..........................................
二、程序流程及函數(shù)間關(guān)系
2.2.1程序流程圖........................................................
2.2.2函數(shù)調(diào)用關(guān)系分析..................................................
三、實(shí)驗(yàn)驗(yàn)證分析
2.3.1輸入的形式和輸入值的范圍..........................................
2.3.2輸出的形式.........................................................
2.3.3程序所能達(dá)到的功能.................................................
2.3.4測試數(shù)據(jù)...........................................................
四、調(diào)試分析
2.4.1調(diào)試過程中的主要技術(shù)問題以及具體的解決方法........................
2.4.2印象最深刻的3個(gè)調(diào)試錯(cuò)誤,及修正方法..............................
五、附錄
2.5.1源代碼及其所屬文件.................................................
第一部分要求與概述
1.1.1問題描述
?密碼學(xué)分為兩類密碼:對稱密碼和非對稱密碼。對稱密碼主要用于數(shù)據(jù)的加/解密,而非對
稱密碼則主要用于認(rèn)證、數(shù)字簽名等場合。非對稱密碼在加密和解密時(shí),是把加密的數(shù)據(jù)
當(dāng)作一個(gè)大的正整數(shù)來處理,這樣就涉及到大整數(shù)的加、減、乘、除和指數(shù)運(yùn)算等,同時(shí),
還需要對大整數(shù)進(jìn)行輸出。請采用相應(yīng)的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)大整數(shù)的加、減、乘、除和指數(shù)運(yùn)
算,以及大整數(shù)的輸入和輸出。
1.1.2基本要求
?要求采用鏈表來實(shí)現(xiàn)大整數(shù)的存儲和運(yùn)算,不允許使用標(biāo)準(zhǔn)模板類的鏈表類(list)和函
數(shù)。同時(shí)要求可以從鍵盤輸入大整數(shù),也可以文件輸入大整數(shù),大整數(shù)可以輸出至顯示器,
也可以輸出至文件。大整數(shù)的存儲、運(yùn)算和顯示,可以同時(shí)支持二進(jìn)制和十進(jìn)制,但至少
要支持十進(jìn)制。大整數(shù)輸出顯示時(shí),必須能清楚地表達(dá)出整數(shù)的位數(shù)。測試時(shí),各種-況都
需要測試,并附上測試截圖;
?要求大整數(shù)的長度可以不受限制,即大整數(shù)的十進(jìn)制位數(shù)不受限制,可以為十幾位的整
數(shù),也可以為500多位的整數(shù),甚至更長;?大整數(shù)的運(yùn)算和顯示時(shí),只需要考慮正的大
整數(shù)。如果可能的話,請以秒為單位顯示每次大整數(shù)運(yùn)算的時(shí)間;
?要求采用類的設(shè)計(jì)路,不允許出現(xiàn)類以外的函數(shù)定義,但允許友元函數(shù)。主函數(shù)中只能
出現(xiàn)類的成員函數(shù)的調(diào)用,不允許出現(xiàn)對其它函數(shù)的調(diào)用。
?要求采用多文件方式:」文件存儲類的聲明,.cpp文件存儲類的實(shí)現(xiàn),主函數(shù)main存
儲在另外一個(gè)單獨(dú)的cpp文件中。如果采用類模板,則類的聲明和實(shí)現(xiàn)都放在.h文件中;
?要求源程序中有相應(yīng)注釋;?不強(qiáng)制要求采用類模板,也不要求采用可視化窗口;?要
求測試?yán)右容^詳盡,各種極限一況也要考慮到,測試的輸出信。要詳細(xì)易懂,表明各個(gè)
功能的執(zhí)行正確;?要求采用VisualC++6.0及以上版本進(jìn)行調(diào)試。
1.1.3設(shè)計(jì)思路
■根據(jù)題目要求,用鏈表來實(shí)現(xiàn)大整數(shù)的存儲,用大整數(shù)類Long_Num并實(shí)現(xiàn)一些基本操作,
設(shè)計(jì)界面菜單類LNmenu來顯示界面;然后,在main函數(shù)中來完成各種操作與檢驗(yàn)。
第二部分具體實(shí)現(xiàn)
2.1.1鏈表類及大數(shù)類的部分說明以及部分源碼
鏈表類:
List由使用指針連接的節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都保存著數(shù)據(jù),以及指向前驅(qū)和后繼的指針。
每個(gè)節(jié)點(diǎn)中存儲一個(gè)數(shù)字表示大數(shù)的一位。
源代碼:
node::node()
{
next=NULL;
pre=NULL;
)
node::node(intp)〃節(jié)點(diǎn)構(gòu)造函數(shù)
(
value二p;
next=NULL;
pre=NULL;
)
大數(shù)類:
大數(shù)類有一個(gè)頭節(jié)點(diǎn)和尾節(jié)點(diǎn),分別為head和back,而back的下一個(gè)節(jié)點(diǎn)為NULL。當(dāng)
head與back指向同一位置時(shí)表示List為只含一個(gè)節(jié)點(diǎn)。Head與back都為NULL表示List
為空。而且用一個(gè)int類型的變量存儲大數(shù)的長度,為以后的運(yùn)算提供便利。
構(gòu)造函數(shù):
,Long_Num()默認(rèn)構(gòu)造函數(shù)。
Long_Num::Long_Num()〃構(gòu)造函數(shù)
(
head=NULL;
back二NULL;
len=0;
)
?voidequal(Long_Numtemp)用equal代替了構(gòu)造函數(shù)。
voidLong_Num::equal(Long_Numtemp)//復(fù)制構(gòu)造函數(shù),將形參復(fù)制給當(dāng)前對象,而非地址傳遞
{
node*p=temp.head;
len=temp.len;
head=newnode(p->value);
back二head;
p=p->next;
while(p)
(
node*Newnode=newnode(p->value);
back->next=Newnode;
Newnode->pre=back;
back=back->next;
p=p->next;
)
}
2.1.2部分簡單函數(shù)功能
?voidlength。把大整數(shù)運(yùn)算過后前面的0去掉,并且更正len長度。
voidLong_Num::length()〃更正對象長度并規(guī)范大整數(shù)
(
node*p=head;
intn_len=0;
while(p->next)
(
if(p->value==0)
(
p=p->next;
head=head-〉next;
head->pre=NULL;
)
else
break;
}
while(p)
{
n_len++;
p=p->next;
}
len=n_len;
)
?voidequalto(Long_Numtemp)判斷兩大整數(shù)是否相等
boolLong_Num::equalto(Long_Numtemp)〃判斷兩大整數(shù)是否相等
node*pl=head,*p2=temp.head;
boolflag=true;
while(flag&&pl)
(
if(pl->value!=p2->value)
flag二false;
else
(
pl=pl->next;
p2=p2->next;
)
)
returnflag;
}
,voidprint()打印并存儲十進(jìn)制數(shù)據(jù)。
voidLong_Num::print()〃打印十進(jìn)制數(shù)并存儲
(
if(head=NULL)
(
cout<<"******數(shù)據(jù)為空!********〃<<endl;
}
else
(
ofstreamoutfile;
outfile.open(/zoutput_Num.ios::app);
node*p=head;
while(p->next)
(
if(p->value==0)
p=p->next;
else
break;
)
while(p)
(
cout<<p->value;
outfile<<p->value;
p=p->next;
)
outfile?endl;
cout?endl;
}
}
?voidprint2()打印并存儲二進(jìn)制數(shù)據(jù)。
voidLong_Num::print2()〃打印二進(jìn)制數(shù)并存儲數(shù)
據(jù)
(
if(head二二NULL)
(
cout。”******數(shù)據(jù)為空!********”<<endl;
}
else
(
ofstreamoutfile;
outfile.open(zzoutput2_Num.txt〃,ios::app);
node*p二head;
while(p->next)
(
if(p->value==0)
p=p->next;
else
break;
)
while(p)
(
cout<<p->value;
outfile?p->value;
p=p->next;
)
outfile<<endl;
cout<<endl;
)
}
?boolcompare(Long_Numtemp)實(shí)現(xiàn)兩個(gè)長度相等的大整數(shù)的比較。
boolLong_Num::compare(Long_Numtemp)〃初級比較,只用于長度相等的
大正間的比較,大于等于返回true
boolflag二false;
node*templ=head,*temp2=temp.head;
while(tempi)
(
if(templ->value!=temp2->value)
(
flag=templ->value>temp2->value?true:false;
break;
)
else
(
templ=templ->next;
temp2=temp2->next;
)
}
if([tempi)
flag=true;
returnflag;
}
?booIcompare2(Long_Numtemp)實(shí)現(xiàn)兩個(gè)大整數(shù)的比較。
boolLong_Num::compare2(Long_Numtemp)〃升級版比較,可比較長度不等
的大整數(shù),大于等于返回true
(
if(len>temp.len)
returntrue;
else
(
if(len==temp.len)
returncompare(temp);
else
returnfalse;
)
)
,voidset_Long_Num(strings)創(chuàng)建大整數(shù),把字符串的內(nèi)容轉(zhuǎn)為int賦給大
整數(shù)。
voidLong_Num::set_Long_Num(strings)〃將輸入的字符串轉(zhuǎn)成大整
數(shù)
intstr_len=s.length();
head二newnode((int)s[0]-48);
len++;
back=head;
if(str_len>l)
(
for(inti=l;i<str_len;i++)
(
node*Newnode=newnode((int)s[i]-48);
len++;
back->next=Newnode;
Newnode-〉pre=back;
back=back->next;
)
}
length();
}
voidLong_Num::set_Long_Num2(inttemp)〃建立大整數(shù),將參數(shù)建立新
節(jié)點(diǎn)加在尾部
(
node*Newnode=newnode(temp);
if(back)
(
back->next=Newnode;
Newnode->pre=back;
back=back->next;
)
else
(
head=Newnode;
back=head;
}
len++;
)
,voidset_Long_Num2(inttemp)如果當(dāng)前大整數(shù)為空,則創(chuàng)建大整數(shù),并把
值賦給它,如果非空,則在后面添加節(jié)點(diǎn),把值賦給節(jié)點(diǎn)。
voidLong_Num::set_Long_Num2(inttemp)〃建立大整數(shù),將參數(shù)建立新
節(jié)點(diǎn)加在尾部
node*Newnode=newnode(temp);
if(back)
back->next=Newnode;
Newnode->pre=back;
back=back->next;
)
else
(
head=Newnode;
back二head;
)
len++;
)
LongNumLongNum::subNum(LongNumtemp,node*&p)〃截取一定長度,用于試商
法
(
Long_Numtempp;
node*pl=head,*p2=temp,head;
strings=;
while(p2)
(
s+=pl->value+,O';
pl=pl->next;
p2=p2->next;
p=p->next;
)
tempp.set_Long_Num(s);
if(!tempp.compare(temp))〃如果截取的子串還是比
參數(shù)小,再向后截一位
(
p=p->next;
tempp.setLongNum2(pl->value);
}
tempp.length();
returntempp;
)
?Long_Numsub_Num(Long_Numtemp,node*&p)截取被除數(shù)的字串,用于
除法與除數(shù)的比較,如果小,則再截取后面一位。
Long_NumLong_Num::subNum(LongNumtemp,node*&p)〃截取一定長度,用于試商
法
(
Long_Numtempp;
node*pl=head,*p2=temp,head;
,〃〃
strings二;
while(p2)
(
s+=pl->value+,O';
pl=pl->next;
p2=p2->next;
p=p->next;
}
tempp.set_Long_Num(s);
if(!tempp.compare(temp))〃如果截取的子串還是比
參數(shù)小,再向后截一位
(
p=p->next;
tempp.set_Long_Num2(pl->value);
)
tempp.length();
returntempp;
}
intLong_Num::result(Long_Numtemp)〃除法中的試商法得到當(dāng)前位
的商
(
length();
intresult=0;
while(compare2(temp))
(
decrease(temp);
result++;
)
length();
returnresult;
)
,intresu11(Long_Numtemp)得到當(dāng)前大整數(shù)除以除數(shù)的商。
intLong_Num::result(Long_Numtemp)〃除法中的試商法得到當(dāng)前位
的商
length();
intresult=0;
while(compare2(temp))
decrease(temp);
result++;
}
length();
returnresult;
)
2.1.3加法
實(shí)現(xiàn)思路:
加法通過兩個(gè)操作數(shù)的每一位相加,滿io進(jìn)位的思路設(shè)計(jì)。
代碼實(shí)現(xiàn):
Long_NumLong_Num::add(Long_Numtemp)〃大整數(shù)加法
(
if(temp.head==NULL||head==NULL)
cout<<〃數(shù)據(jù)為空!z/?endl;〃考慮數(shù)據(jù)的特殊情況
else
(
node*templ,*temp2;
inti=0,j;
if(len>temp.len)
(
templ=back;
temp2=temp.back;〃如果當(dāng)前大整數(shù)大于后一個(gè),則tempi為長的最后一
個(gè)節(jié)點(diǎn)
for(;;)
(
while(temp2!=NULL)
(
j=templ->value+temp2->value+i;
templ->value=j%10;
if(j>=10)
i=l;
else
i=0;
temp2=temp2->pre;
tempi=tempi->pre;
)〃在短的那個(gè)數(shù)還沒有遍歷完的情況下,實(shí)現(xiàn)每一位的加法,設(shè)置
一個(gè)i變量,默認(rèn)設(shè)為0。如果滿10則設(shè)為1,并在前一位加上,否則設(shè)為0。
if(tempi==NULL)
if(i==l)
node*Newnode=newnode(1);
Newnode->next=head;
head->pre=Newnode;
head=head->pre;
break;
)
else
break;〃如果到了長的那個(gè)數(shù)的頭一位,而i仍為1,則在
大整數(shù)的前面添加值1的節(jié)點(diǎn)。
)
if(tempi!=NULL)
(
j=templ->value+i;
templ->value=j%10;
if(j>=10)
i=l;
else
i=0;
)
templ=templ->pre;〃如果還沒到長的那個(gè)數(shù)的頭一個(gè),執(zhí)行i與當(dāng)前
數(shù)的加法,如果滿10則i為1,否則i為0。
)
length();
return*this;〃把第一個(gè)不為0的數(shù)的前面的0去掉,并
更正大整數(shù)的長度,并返回長的那個(gè)對象。
)
if(len==temp.len)
(
i=0;
templ=back;
temp2=temp.back;
while(tempi.->pre!=NULL)
(
j=templ->value+temp2->value+i;
if(j>=10)
(
templ->value=j%10;
i=l;
)
else
templ->value=j;
i=0;
}
temp2=temp2->pre;
templ=templ->pre;
)
J=templ->value+temp2->value+i;〃兩個(gè)大整數(shù)位數(shù)相同,每一位都相
加,滿10進(jìn)1。
if(j>=10)
(
templ->value=j%10;
node*Newnode=newnode(l);
head->pre=Newnode;
Newnode->next=head;
head=head->pre;
}
else
templ->value=j;//到了頭一位時(shí),如果i為1,則在大整
數(shù)前面添加值為1的節(jié)點(diǎn)。
length();
return*this;
)
if(len<temp.len)
(
tempi=temp,back;
temp2=back;
for(;;)
{
while(temp2!=NULL)
(
j=templ->value+temp2->value+i;
templ->value=j%10;
if(j>=10)
i=l;
else
i=0;
temp2=temp2->pre;
tempi二tempi->pre;
}//在短的那個(gè)數(shù)還沒有遍歷完的情況下,實(shí)現(xiàn)每一位的加法,設(shè)
置一個(gè)i變量,默認(rèn)設(shè)為0。如果滿10則設(shè)為1,并在前一位加上,否則設(shè)為0。
if(templ=NULL)
(
if(i==l)
(
node*Newnode=newnode(1);
Newnode->next=temp.head;
temp.head->pre=Newnode;
temp.head=temp.head->pre;
break;
}
else
break;
}
if(tempi!=NULL)
(
j=templ->value+i;
templ->value=j%10;
if(j>=10)
i=l;
else
i=0;
}
templ=templ->pre;//如果還沒到長的那個(gè)數(shù)的頭一個(gè),執(zhí)行i
與當(dāng)前數(shù)的加法,如果滿10則i為1,否則i為0。
)
equal(temp);
length();
return*this;〃把第一個(gè)不為0的數(shù)的前面的0去掉,并更正大整數(shù)
的長度,并返回長的那個(gè)對象。
)
)
2.1.4減法
實(shí)現(xiàn)思路:
減法通過兩個(gè)操作數(shù)每一位相減,不夠則借位的思路設(shè)計(jì)。
代碼實(shí)現(xiàn):
Long_NumLong_Num::decrease(Long_Numtemp)〃大整數(shù)減法
{
if(head==NULL||temp.head==NULL)
cout?〃數(shù)據(jù)為空!〃<<endl;〃考慮數(shù)據(jù)的特殊情況
else
(
node*templ,*temp2;
inti=0,j;
if(len>temp.len)
tempi二back;
temp2=temp.back;
while(tempi)
(
while(temp2!=NULL)
(
j=templ->value-temp2->value-i;
if(j<0)
(
templ->value=j+10;
i=l;
)
else
(
templ->value=j;
i=0;
)
templ=templ->pre;
temp2=temp2->pre;
}〃在短的那個(gè)數(shù)還沒有遍歷完的情況下,實(shí)現(xiàn)每一位
的減法,設(shè)置一個(gè)i變量,默認(rèn)設(shè)為0。如果不夠則設(shè)為1,并在前一位減去,否則設(shè)為0。
j=templ->value-i;
if(j<0)
{
templ->value=j+10;
i=l;
)
else
{
templ->value=j;
i=0;
)
templ=templ->pre;〃如果還沒到長的那個(gè)數(shù)的頭一個(gè),執(zhí)行i
與當(dāng)前數(shù)的減法,如果不夠則i為1,否則i為。。
)
length();
return*this;〃把第一個(gè)不為0的數(shù)的前面的0去掉,
并更正大整數(shù)的長度,并返回長的那個(gè)對象。
)
if(len==temp.len)
(
inti=0,j;
node*templ,*temp2;
if(compare(temp))
if(equalto(temp))
{
set_Long_Num(z,0,z);
return*this;
)〃兩個(gè)大整數(shù)相等則直接返回0
else
(
tempi=back;
temp2=temp.back;
while(tempi)
(
j=templ->value-temp2->value-i;
if(j<0)
(
templ->value=j+10;
i=l;
)
else
(
templ->value=j;
i=0;
)
templ=templ->pre;
temp2=temp2->pre;//兩個(gè)大整數(shù)位數(shù)相同,每
一位都相減,不夠則把i=l,在前面一位減的時(shí)候減去,再把i=0,否則就i=0。
)
length();
return*this;〃把第一個(gè)不為0的數(shù)的前面的0去
掉,并更正大整數(shù)的長度,并返回長的那個(gè)對象。
)
)
else
(
Long_Numtempp;
tempp.equal(temp);
templ=tempp.back;
temp2=back;
while(tempi)
(
j=templ->value-temp2->value-i;
if(j<0)
(
templ->value=j+10;
i=l;
else
(
templ->value=j;
i=0;
)
tempi=tempi->pre;
temp2=temp2->pre;
)
equal(tempp);
length();
return*this;
)
)
if(len<temp.len)
(
Long_Numtempp;
tempp.equal(temp);
templ=tempp.back;
temp2=back;
while(tempi)
(
while(temp2!=NULL)
(
j=templ->value-temp2->value-i;
if(j<0)
(
templ->value=j+10;
i二1;
}
else
(
templ->value=j;
i=0;
)
tempi二tempi->pre;
temp2=temp2->pre;
}〃在短的那個(gè)數(shù)還沒有遍歷完的情況下,實(shí)現(xiàn)每一位的減法,但是用長
的那個(gè)減去短的那個(gè),設(shè)置一個(gè)i變量,默認(rèn)設(shè)為0。如果不夠則設(shè)為1,并在前一位減去,
否則設(shè)為0。
j=templ->value-i;
if(j<0)
templ->value=j+10;
i二1;
)
else
(
templ->value=j;
i=0;
}
templ=templ->pre;〃如果還沒到長的那個(gè)數(shù)的頭一個(gè),執(zhí)行
i與當(dāng)前數(shù)的減法,用長的那個(gè)數(shù)減短的,如果不夠則i為1,否則i為0。
)
equal(tempp);
length();
return*this;〃把第一個(gè)不為0的數(shù)的前面的0去掉,
并更正大整數(shù)的長度,并返回長的那個(gè)對象。
)
2.1.5乘法
實(shí)驗(yàn)思路:
乘法通過一個(gè)操作數(shù)的每一位分別于另一個(gè)操作數(shù)的每一位相乘,得到的結(jié)果再相加設(shè)
計(jì)。
代碼實(shí)現(xiàn):
Long_NumLong_Num::changeO〃刪除頭尾節(jié)點(diǎn)(乘法專
用)
{
node*pl=head->next;
node*p2=head;
while(pl->next!=NULL)
(
p2->value=pl->value;
pl=pl->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->pre;
p->pre=NULL;
return*this;〃刪除乘法一開始創(chuàng)建的頭尾兩個(gè)節(jié)點(diǎn),并重新定義
頭尾節(jié)點(diǎn)。
)
Long_Nummultiply(Long_Numtempp,Long_Numtemps)〃大整數(shù)乘法
(
Long_Numsum,ex,ex;
ex.head二newnode(0);
ex.len++;
ex.back=ex.head;
sum.head=newnode(0);
sum.len++;
sum.back=sum.head;
ex.head=newnode(0);
ex.len++;
ex.back=ex.head;
node*templ,*temp2,*tempt;
templ=tempp.back;
temp2=temps.back;
for(intw=0;temp2!=NULL;w++)〃設(shè)置w變量,從0循環(huán)到第二個(gè)大整數(shù)的長度。
(
Long_Num1;
inti=0,j;
1.head=newnode(0);
1.back=newnode(0);
1.head->next=l.back;
1.back->pre=l.head;
temptG.back;〃先創(chuàng)建一個(gè)大整數(shù)1,頭尾結(jié)點(diǎn)分別為0。
for(;;)
(
while(tempi!=NULL)
(
j=templ->value*temp2->value+i;
i二j/10;
templ=templ->pre;
node*Newnode=newnode();
Newnode->pre=l.head;
Newnode->next=l.head->next;
tempt->pre=Newnode;
1.head->next=Newnode;
tempt二tempt->pre;
tempt->value=j%10;
1.len++;
}〃把一個(gè)大整數(shù)的每一位乘以另一個(gè)大整數(shù)的第一
位,設(shè)置i=0,結(jié)果加上i除以10,商賦給當(dāng)前值,余數(shù)賦給i,把當(dāng)前值插入到1的頭結(jié)
點(diǎn)后,1的長度加1。
for(intww=0;w<w;ww++)
(
node*Newnode=newnode(0);
1.back->next=Newnode;
Newnode->pre=l.back;
1.back=Newnode;
1.len++;
)〃當(dāng)一個(gè)大整數(shù)的每一位乘完以后,把另一個(gè)大整數(shù)的位
數(shù)往前移一位,并且移動一次,要在1后面添加一個(gè)值為0的節(jié)點(diǎn),并且1的長度加1。
if(tempi二二NULL)
(
if(i!=0)
(
node*Newnode=newnode(i);
Newnode->next=l.head->next;
1.head->next->pre=Newnode;
1.head->next=Newnode;
Newnode->pre=l.head;
1.len++;
}
}//當(dāng)?shù)竭_(dá)第一個(gè)大整數(shù)的頭一位時(shí)i仍不為0,則在1
的頭結(jié)點(diǎn)后面插入值為i的節(jié)點(diǎn),并且1的長度加lo
templ=tempp.back;
temp2=temp2->pre;
ex.len=l.len-2;
ex二1.change。;〃去掉原先創(chuàng)建的頭尾兩個(gè)值為0的節(jié)點(diǎn),長度減2。
cx=sum;
ex.len=sum.len;
sum=ex.add2(ex);
break;
)
}
sum.len++;
sum.length();
returnsum;〃把第一個(gè)不為0的數(shù)的前面的0去掉,并更正大整數(shù)的長度,
并返回。
2.1.6除法
實(shí)驗(yàn)思路:
除法通過先在被除數(shù)中取跟除數(shù)一樣的位數(shù),進(jìn)行不斷的減法操作,直至小于除數(shù),然后
再向后面取數(shù)直至位數(shù)于除數(shù)相同,重復(fù)。
代碼實(shí)現(xiàn):
intLong_Num::result(Long_Numtemp)〃除法中的試商法得到當(dāng)前
位的商
(
length();
intresult=O;
while(compare2(temp))
(
decrease(temp);
result++;
}
length();
returnresult;
)
voidLong_Num::set_Long_Num2(inttemp)〃建立大整數(shù),將參數(shù)建立新
節(jié)點(diǎn)加在尾部
(
node*Newnode=newnode(temp);
if(back)
(
back->next=Newnode;
Newnode->pre=back;
back=back->next;
)
else
(
head二Newnode;
back=head;
}
len++;
}
Long_NumLong_Num::sub_Num(Long_Numtemp,node*&p)〃截取一定長度,用于試商
法
(
LongNumtempp;
node*pl=head,*p2=temp.head;
?〃〃
strings=;
while(p2)
(
s+=pl->value+,O';
pl=pl->next;
p2=p2->next;
p=p->next;
)
tempp.set_Long_Num(s);
if(!tempp.compare(temp))〃如果截取的子串還是比
參數(shù)小,再向后截一位
{
p=p->next;
tempp.set_Long_Num2(pl->value);
)
tempp.length();
returntempp;
)
Long_NumLong_Num::divide(Long_Numtempi,Long_Num&temp2)〃大整數(shù)除法
(
strings_result二〃〃;
intsh;
Long_Numtemp;
if(compare2(tempi))
(
if(len>templ.len)
(
node*curren=head;
temp=sub_Num(tempi,curren);//當(dāng)被除數(shù)位數(shù)比除數(shù)
大,先創(chuàng)建一個(gè)大整數(shù)temp,存儲在被除數(shù)上截取除數(shù)長度的一段值,如果不夠大,則往
后面再截取一位。
sh=temp.result(tempi);//sh為一次除法得
到的商,temp為得到的余數(shù)
s_result+=sh+,;〃創(chuàng)建一個(gè)字符串s,
來累加商
while(curren)
(
temp.set_Long_Num2(curren->value);
sh=temp.result(tempi);
s_result+z:sh+,0,;
curren=curren->next;
)〃余數(shù)加上后一位的值構(gòu)成大整數(shù)
除以除數(shù),如果比除數(shù)小則s加上0,否則s加上商,重復(fù)直至最后。
temp2.equal(temp);
set_Long_Num(s_resu11);
length();
return*this;〃返回字符串s為總的商,把余數(shù)賦給
第二個(gè)大整數(shù)參數(shù)
)
else
sh=result(tempi);
s_result+=sh+,O';
temp2.equal(*this);
set_Long_Num(s_result);
length();
return*this;〃當(dāng)被除數(shù)位數(shù)和除數(shù)相同,如上進(jìn)
行一次除法操作。
)
}
else
(
temp2.equal(*this);
set_Long_Num(〃0");
return*this;〃當(dāng)被除數(shù)位數(shù)比除數(shù)小,就直接返回s
為0,余數(shù)為被除數(shù).
)
)
2.1.7幕運(yùn)算
實(shí)驗(yàn)思路:
幕運(yùn)算則通過底數(shù)自乘,累減1,結(jié)合加法,乘法,減法的方法實(shí)現(xiàn)。
代碼實(shí)現(xiàn):
boolIf_one(Long_Numtemp)〃判斷對象是為1
{
boolflag=false;
node*p=temp.back;
if(p->value!=l)
returnflag;
else
{
p=p->pre;
flag=true;
while(p)
(
if(p->value!=0)
(
flag=false;
break;
)
else
p=p->pre;
)
returnflag;
boolIf_zero(Long_Numtemp)〃判斷對象是否為0
(
boolflag=false;
node*p=temp.back;
if(p->value!=0)
returnflag;
else
(
p=p->pre;
flag=true;
while(p)
(
if(p->value!=0)
(
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吉林工商學(xué)院《音樂圖像學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南女子學(xué)院《綜藝主持》2023-2024學(xué)年第一學(xué)期期末試卷
- 黑龍江農(nóng)墾職業(yè)學(xué)院《草書》2023-2024學(xué)年第一學(xué)期期末試卷
- 高考物理總復(fù)習(xí)《電容器帶電粒子在電場中的運(yùn)動》專項(xiàng)測試卷含答案
- 鄭州城市職業(yè)學(xué)院《管理科學(xué)與工程學(xué)科論文寫作指導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院《影視攝像技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)學(xué)校微信公眾號信息發(fā)布工作制度
- 浙江財(cái)經(jīng)大學(xué)《基礎(chǔ)醫(yī)學(xué)概論Ⅱ3(微生物學(xué))》2023-2024學(xué)年第一學(xué)期期末試卷
- 張家口職業(yè)技術(shù)學(xué)院《法務(wù)談判與技巧》2023-2024學(xué)年第一學(xué)期期末試卷
- 缺陷管理與風(fēng)險(xiǎn)評估實(shí)施細(xì)則
- 幼兒園籃球課培訓(xùn)
- AQ 6111-2023個(gè)體防護(hù)裝備安全管理規(guī)范知識培訓(xùn)
- 老干工作業(yè)務(wù)培訓(xùn)
- 基底節(jié)腦出血護(hù)理查房
- 高中語文《勸學(xué)》課件三套
- 人教版八年級物理-第二章:聲現(xiàn)象復(fù)習(xí)完整課件
- 直播代運(yùn)營服務(wù)合同范本版
- 2024年江蘇蘇州中考數(shù)學(xué)試卷及答案
- 2024年山東省高中自主招生數(shù)學(xué)模擬試卷試題(含答案)
- 算術(shù)平方根2課件
- 【人教版】九年級化學(xué)上冊期末試卷及答案【【人教版】】
評論
0/150
提交評論