//?BigInteger.h?包括節點結構的定義和BigInteger類的定義。
//?BigInteger.cpp?包含BigInteger類中成員函數的具體內容。
//?main.cpp?主要功能...
/*********************************************************/
//BigInteger.h
struct?Node//定義節點的結構。
{
夏爾?Num
節點?*Prev,* Next
};
班級?BigInteger//定義BigInteger?種類
{
節點?*Head,*End,* TempNode
作廢?AddHead(char?num);
作廢?加數(char?num);
公共:
big integer();
BigInteger(const?BigInteger?& ampBigNum);
作廢?get number();
作廢?disp();
BigInteger?接線員?+?(const?BigInteger?& ampBigNum);
BigInteger?接線員?*?(const?BigInteger?& ampBigNum);
BigInteger?接線員?=?(const?BigInteger?& ampBigNum);
~ big integer();
};
//BigInteger.cpp
#包含?& ltiostream.h & gt
#包含?& ltstdio.h & gt
#包含?" BigInteger.h "
BigInteger::BigInteger()//構造函數,使每個節點為空。
{
Head = End = TempNode = NULL
}
BigInteger::BigInteger(常量?BigInteger?& ampBigNum)?//復制結構
{
節點?* p;
Head = End = TempNode = NULL
p=BigNum。頭;
while(p)
{
加數。num);
p = p-& gt;接下來;
}
}
BigInteger::~BigInteger()//析構函數
{
節點?* NextNode
if(Head==NULL)
返回;
TempNode = Head
while(臨時節點)
{
next node = TempNode-& gt;接下來;
刪除?TempNode
TempNode = NextNode
}
Head = NULL
End = NULL
TempNode = NULL
}
作廢?BigInteger::AddHead(char?Num)//在鏈表的頭部插入壹個節點
{
TempNode=new?節點;
TempNode-& gt;Num = Num
TempNode-& gt;Prev = NULL
如果(!頭)
{
Head = End = TempNode
TempNode-& gt;Next = NULL
}
其他
{
TempNode-& gt;下壹個=頭;
head->;Prev = TempNode
Head = TempNode
}
}
作廢?BigInteger::AddEnd(char?Num)?//在鏈表的末尾插入壹個節點
{
TempNode=new?節點;
TempNode-& gt;Num = Num
TempNode-& gt;Next = NULL
如果(!頭)
{
Head = End = TempNode
TempNode-& gt;Prev = NULL
}
其他
{
TempNode-& gt;Prev = End
end->;Next = TempNode
End = TempNode
}
}
作廢?BigInteger::GetNumber()//輸入部分
{
夏爾?關鍵;
int?count=0,num = 0;
while((key=getchar())!=10)//判斷輸入是否為回車,如果不是,將內容從後往前放入鏈表。
{
if(key & gt;='0'?& amp& amp?key & lt='9')
{
num = key-' 0 ';
加數(數字);
num = 0;
}
}
}
BigInteger?BigInteger::運算符?+?(const?BigInteger?& ampBigNum2)//重載"+"
{
BigInteger?& ampBigNum1=*this,result
節點?*temp1,* temp2
int?TempNum,rest = 0;
temp1=BigNum1。結束;//將臨時鏈表的第壹個地址放在輸入鏈表的末尾。
temp2=BigNum2。結束;
while(temp1?& amp& amp?溫度2)
{
TempNum = int(temp 1->;num)+int(temp 2->;num)+休息;?//在節點中添加元素並添加進位剩余。
if(TempNum & gt;9)//判斷加法結果是否會產生進位。
{
TempNum = TempNum-10;
rest = 1;
}
其他
休息= 0;
結果。AddHead(char(TempNum));//將結果放入最終結果鏈表中。
temp 1 = temp 1->;Prev
temp 2 = temp 2-& gt;Prev
}
if(temp 2)temp 1 = temp 2;
while(temp1)
{
int(TempNum)= int(temp 1-& gt;num)+休息;?//節點中的元素加上進位剩余
if(TempNum & gt;9)
{
TempNum = TempNum-10;
rest = 1;
}
其他
rest = 0;
結果。AddHead(char(TempNum));?//將結果放入最終結果鏈表中。
temp 1 = temp 1->;Prev
}
如果(休息)
結果。AddHead(char(rest));//考慮最後壹個進位是否存在,如果存在,存儲在鏈表的頭。
回歸?結果;
}
BigInteger?BigInteger::運算符?*?(const?BigInteger?& ampBigNum2)?//過載*。
{
BigInteger?& ampBigNum1=*this,temp,result
節點?*temp1、*temp2、*tempa、* tempb
int?TempNum,rest,i=0,rest 2;
temp1=BigNum1。結束;
temp2=BigNum2。結束;
而(temp2)//是否將被乘數的每壹位相乘,是通過乘數的有無來判斷的。
{
rest = 0;
while(temp1!=空)
{
TempNum = int(temp 1->;num)* int(temp 2-& gt;num)+休息;
if(TempNum & gt;9)
{?
rest = TempNum/10;?//通過乘法結果與10的商得到進位。
TempNum = TempNum % 10;?//將乘法結果和10進行調制,得到壹個比特。
}
其他
rest = 0;
在…之時AddHead(char(TempNum));//存儲在臨時鏈表中
temp 1 = temp 1->;Prev
}
如果(休息!=0)溫度。AddHead(char(rest));
for(int?k = I;k & gt=1;k -)溫度。加數(char(0));?//判斷鏈表後面要加幾個零。
i++;//每次相乘後計數,下次用它補0。
temp1=BigNum1。結束;?//將被乘數復位到底,這樣下次乘數就可以把每個元素相乘了。
temp 2 = temp 2-& gt;Prev//從鏈表的前壹個取出乘數。
tempa =結果。結束;//下面是把每個乘數和被乘數的乘法結果累加起來,放到最後的鏈表中輸出。
如果(結果。頭!=NULL)?//以下過程與“+”重載基本相同,只是臨時鏈表為空,不做詳細註釋。
{
結果。End =溫度。頭;
結果。Head = NULL
}
tempb =溫度。結束;
rest 2 = 0;
而(tempa!=NULL?& amp& amp?tempb!=空)
{
TempNum = int(tempa-& gt;num)+int(tempb-& gt;num)+rest 2;
if(TempNum & gt;9)
{
TempNum = TempNum-10;
rest 2 = 1;
}
其他
rest 2 = 0;
結果。AddHead(char(TempNum));
tempa = tempa-& gt;Prev
tempb = tempb-& gt;Prev
}
if(tempb)tempa = tempb;
白色(tempa)
{
int(TempNum)= int(tempa-& gt;num)+rest 2;
if(TempNum & gt;9)
{
TempNum = TempNum-10;
rest 2 = 1;
}
其他
rest 2 = 0;
結果。AddHead(char(TempNum));
tempa = tempa-& gt;Prev
}
if(剩余2)
結果。AddHead(char(rest 2));
如果(溫度。頭!=空)
{
在…之時End =溫度。頭;
在…之時Head = NULL
}
tempb = NULL
}
回歸?結果;
}
BigInteger?BigInteger::運算符?=?(const?BigInteger?& ampBigNum)//重載=符號
{
如果(this = = & ampBigNum)
回歸?*這個;
節點?* p;
TempNode = Head = End = NULL
p=BigNum。頭;
while(p)
{
加數。num);
p = p-& gt;接下來;
}
回歸?*這個;
}
作廢?BigInteger::disp()//輸出鏈表
{
如果(頭)
{
cout & lt& ltint(Head->;num);
TempNode = Head-& gt;接下來;
}
不然呢?返回;
while(臨時節點)
{
cout & lt& ltint(TempNode-& gt;num);
TempNode = TempNode-& gt;接下來;
}
cout & lt& ltendl
}
//main.cpp
#包含?& ltiostream.h & gt
#包含?" BigInteger.h "
作廢?主()
{
BigInteger?BigNum1,BigNum2,BigNum3
int?c;
cout & lt& lt"選擇您要執行的操作:"
cout & lt& lt"1.大整數加法運算”
cout & lt& lt"2.大整數乘法”
cout & lt& lt"選擇您需要執行的操作:"
CIN & gt;& gtc;
開關(c)
{
案子?1:
{?
cout & lt& lt"答:" & lt& ltendl
BigNum1。get number();
cout & lt& lt" B:" & lt;& ltendl
BigNum2。get number();
bignum 3 = bignum 1+bignum 2;
cout & lt& lt"加法的結果是:"
big num 3 . disp();
}破;
案子?2:
{
cout & lt& lt"答:" & lt& ltendl
BigNum1。get number();
cout & lt& lt" B:" & lt;& ltendl
BigNum2。get number();
bignum 3 = bignum 1 * bignum 2;
cout & lt& lt"乘法的結果是:"
big num 3 . disp();
}破;
默認:break
}
}