大數(shù)運(yùn)算法則_第1頁(yè)
大數(shù)運(yùn)算法則_第2頁(yè)
大數(shù)運(yùn)算法則_第3頁(yè)
大數(shù)運(yùn)算法則_第4頁(yè)
大數(shù)運(yùn)算法則_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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、中國(guó)科學(xué)技術(shù)大學(xué)繼續(xù)教育學(xué)院課程設(shè)計(jì)論文報(bào)告論文題目:大數(shù)四則運(yùn)算的C+實(shí)現(xiàn)學(xué)員姓名:王歡 學(xué) 號(hào):TB04039103專(zhuān) 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 指導(dǎo)教師:日 期:2007年1月10日大數(shù)四則運(yùn)算的C+實(shí)現(xiàn)摘要大數(shù)運(yùn)算不僅僅運(yùn)用在密碼學(xué)中,還運(yùn)用在一些物理學(xué)研究、生物學(xué),化學(xué)等科目中。 大數(shù)運(yùn)算,意味著參加的值和計(jì)算結(jié)果通常是以上百位數(shù),上千位數(shù)以及更大長(zhǎng)度之間的整數(shù)運(yùn) 算。例如大家所熟知圓周率n的值,在一般的數(shù)值計(jì)算中用到圓周率的不須要多大的精度,但在 計(jì)算一些星球或是星系上的體積面積時(shí)便顯的誤差很大了,這就要求n值計(jì)算的精度達(dá)到幾百萬(wàn) 位甚至更高,才能縮小誤差。人工計(jì)算是遠(yuǎn)遠(yuǎn)不行了,而且本

2、身誤差也無(wú)法估計(jì)。只有在計(jì)算機(jī) 中用大數(shù)運(yùn)算求兀值了。又如,考古學(xué)家計(jì)算石頭內(nèi)的碳元素衰變來(lái)考證地球形成的時(shí)間,更是 將計(jì)算的結(jié)果精確到了百年以?xún)?nèi)。所以說(shuō)大數(shù)的運(yùn)算是涉及領(lǐng)域多,應(yīng)用范廣,與我們生活息息 關(guān)。在此,我采用一個(gè)在C語(yǔ)言下實(shí)現(xiàn)計(jì)算大數(shù)運(yùn)算的一個(gè)程序?yàn)槔?,講解包括了大數(shù)的加法, 減法,乘法和除法及求冪運(yùn)算的算法及代碼。關(guān)鍵詞大數(shù)計(jì)算網(wǎng)絡(luò)安全密碼學(xué)隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展和因特網(wǎng)的廣泛普及,網(wǎng)絡(luò)安全事故逐年增加,黑客的攻擊已經(jīng) 和病毒并列成為對(duì)信息安全影響最嚴(yán)重的兩大危害。其很大程度上是被黑客破解了用戶(hù)的計(jì)算機(jī) 名及登陸密碼及資料的加密較差,而使得黑客來(lái)對(duì)網(wǎng)民的資料如同自己般的隨意更改

3、和破壞。而 安全的密碼和賬號(hào)成為了網(wǎng)民的安全之本,怎么才能提高安全問(wèn)題成為的人們和社會(huì)關(guān)注的問(wèn) 題。而加密大部又是以大素?cái)?shù)的計(jì)算為基礎(chǔ)的,如非對(duì)稱(chēng)密碼體制RSA的安全性依賴(lài)于對(duì)大數(shù)進(jìn) 行因數(shù)分解的耗時(shí)性。一個(gè)二進(jìn)制數(shù)n的因數(shù)分解所需的機(jī)器周期大約是 expln(n)ln(ln(n)1/2。若機(jī)器周期為1s,b為二進(jìn)制數(shù)的位數(shù),分解n=2b所需時(shí)間如 下表所示:位數(shù)1002003005007501000時(shí)間30秒3天9年1兆年2*109 年6*1015 年實(shí)際應(yīng)用中,p、q的選擇都在10200數(shù)字以上,這樣每個(gè)明文塊的二進(jìn)制位數(shù)可達(dá)664比 特,即83個(gè)字節(jié)。而DES只有8個(gè)字符。一般認(rèn)為,對(duì)于

4、當(dāng)前的計(jì)算機(jī)水平,選擇1024位長(zhǎng)的 密鑰就可認(rèn)為是無(wú)法攻破的了。數(shù)字存儲(chǔ)的實(shí)現(xiàn)大數(shù)計(jì)算的因數(shù)和結(jié)果精度一般是少則數(shù)十位,多則幾萬(wàn)位。在C語(yǔ)言中定義的類(lèi)型中精度 最多只有二十多位,因而我們采取用鏈表存貯的方式來(lái)存放大數(shù)。在計(jì)算中會(huì)用到從高位開(kāi)始計(jì) 算,和從低位開(kāi)始計(jì)算數(shù)值的兩種情況。所以我們將鏈表定義為雙向鏈表,其中為一個(gè)單元來(lái)存 貯數(shù)據(jù),一個(gè)指針指向前方的數(shù)據(jù),另一個(gè)指向后的數(shù)據(jù)。其結(jié)構(gòu)為:struct Node /定義一個(gè)雙向鏈表用來(lái)存貯結(jié)果 char data;/數(shù)據(jù)*定義為字符的原因:要顯示負(fù)號(hào)Node *next;/尾指針Node *ahead;/首指針;各種算法2.1加法運(yùn)算的實(shí)現(xiàn)

5、加法計(jì)算還是比較容易的,我們也是先從低位算起,因?yàn)橹豁氁獙?duì)應(yīng)的位相加,再加上前一 位的進(jìn)位,再去判斷是否本位是否有進(jìn)位,有則把本位數(shù)字改為減去它的權(quán),也就是10,再置 進(jìn)位為1。如果沒(méi)有進(jìn)位,則給進(jìn)位賦值0。在程序時(shí)應(yīng)注意:1、兩個(gè)加數(shù)中那一個(gè)數(shù)的位數(shù)長(zhǎng),以位數(shù)長(zhǎng)的作為循環(huán)變量;2、結(jié)束循環(huán)時(shí),不僅僅是最后一位加完就停止,還應(yīng)加入如果有進(jìn)位,也要再循環(huán)一次。如最后一位是9,進(jìn)位是1,則相加時(shí)進(jìn)位,要加上進(jìn)位這一位值。具體看代碼,輸入輸出時(shí)和 乘法的一樣。/*函數(shù)名稱(chēng):大數(shù)加法*函數(shù)過(guò)程:1比較兩個(gè)數(shù)那一個(gè)長(zhǎng)2以長(zhǎng)的作為循環(huán)次數(shù)3對(duì)應(yīng)項(xiàng)相加進(jìn)位存貯直到下高位相加用4直到循環(huán)結(jié)束5 !沒(méi)設(shè)計(jì)負(fù)數(shù)相

6、加*入口參數(shù):numa,numb,result 字符串*出口參數(shù):無(wú)*編輯環(huán)境:winSP2 + VC2003 + C+*/void addition(char *numa, char *numb,char *result) / 計(jì)算兩大數(shù)之和char *pna = findend(numa); / 指向 numa 的一個(gè)指針。point numa pna 指向乘數(shù)的最低位,char *pnb = findend(numb); 指向numb的一個(gè)指針/pnb指向被乘數(shù)的最低位,int along=(int)strlen(numa); 標(biāo)記數(shù)字 a 的長(zhǎng)度;int blong=(int)strl

7、en(numb); 標(biāo)記數(shù)字 b 的長(zhǎng)度;int times = 0; /標(biāo)致要計(jì)算多少次。int carry=0,temp_result; 存貯進(jìn)位和臨時(shí)結(jié)果的Node *head, /用于存貯頭指針*pstart, /用于存貯計(jì)算時(shí)的首指針*pnew; /作于申請(qǐng)新結(jié)點(diǎn)head = pstart =new Node; 初始化首結(jié)點(diǎn)和頭結(jié)點(diǎn)。pstart - data = 0;pstart - next = NULL;pstart - ahead = NULL;if (abigerb(numa ,numb)=1)times = (int)strlen(numa); /比較兩個(gè)字符串長(zhǎng)度,以大

8、的作為循環(huán)次數(shù)elsetimes = (int)strlen(numb);pna = findend(numb); 交換指針pnb = findend(numa);along=(int)strlen(numb); 標(biāo)記數(shù)字 a 的長(zhǎng)度;blong=(int)strlen(numa); 標(biāo)記數(shù)字 b 的長(zhǎng)度;while (times & (times=0)| carry != 0)if(!pstart-next) 如果當(dāng)前為空結(jié)點(diǎn),則申請(qǐng)新結(jié)點(diǎn)pnew = new Node;pnew - data = 0;pnew - next = NULL;pnew - ahead = pstart;psta

9、rt - next = pnew;else temp_result =(pstart-data +(*pna-48) + (*pnb-48)+carry) ; / 自身的值+新值+ 進(jìn)位作為當(dāng)前的新值pstart - data = temp_result%10; /存貯個(gè)位carry = temp_result/10; 存貯進(jìn)位pstart = pstart - next; 結(jié)點(diǎn)移動(dòng)blong一;if(blong0)pnb-; /指針移向被加數(shù)高位else *pnb=48; 之后相減就變?yōu)榱?0不作任何運(yùn)算;pna-; /加數(shù)指針移動(dòng),pstart =head; 尋找鏈表的結(jié)尾點(diǎn)while(p

10、start-next != 0)pstart-data += 48; /!逆順輸出 pstart = pstart-next ;int tip = 0; /轉(zhuǎn)為字符串用pstart = pstart-ahead ; 找有效字/coutdata;/coutahead ;resulttip = 0;pstart =head; 釋放空間while(pstart-next != 0)pnew = pstart-next ;delete pstart;pstart =pnew;return ; 2.2減法運(yùn)算的實(shí)現(xiàn)減法稍微有一點(diǎn)復(fù)雜,因?yàn)闀?huì)處理負(fù)數(shù),而我們所用的是字符串的形式來(lái)保存數(shù)字也是為 這一點(diǎn)。否

11、則用整型或其它類(lèi)型時(shí),則表示處理、保存時(shí)會(huì)相當(dāng)復(fù)雜。算法也是從低位開(kāi)始減。 先要判斷減數(shù)和被減數(shù)那一個(gè)位數(shù)長(zhǎng),減數(shù)位數(shù)長(zhǎng)是正常減;被減數(shù)位數(shù)長(zhǎng),則被減數(shù)減減數(shù), 最后還要加上負(fù)號(hào);兩數(shù)位數(shù)長(zhǎng)度相等時(shí),最好比那一個(gè)數(shù)字大,否則負(fù)號(hào)處理會(huì)很繁瑣;處理 每一項(xiàng)時(shí)要,如果前一位相減有借位,就先減去上一位的借位,無(wú)則不減,再去判斷是否能夠減 開(kāi)被減數(shù),如果減不開(kāi),就要借位后再去減,同時(shí)置借位為1,否則置借位為0。這有一我寫(xiě)的比較兩個(gè)數(shù)字符串大小的函數(shù):返回值說(shuō)明:0 是 alongblong ; 2 是 along=blongint abigerb(char *numa, char *numb) /比較

12、兩個(gè)數(shù)最高位那一個(gè)大 int along=(int)strlen(numa); 標(biāo)記數(shù)字 a 的長(zhǎng)度;int blong=(int)strlen(numb); 標(biāo)記數(shù)字 b 的長(zhǎng)度;char *pna = numa; /指向數(shù)A的最高位,char *pnb = numb; /指向數(shù)B的最高位,if (alongblong) return 1;if (along=blong)while(*pna) /比較兩個(gè)數(shù)那一個(gè)大if(*pna*pnb)return 1;else if(*pna data = 0;pstart - next = NULL;pstart - ahead = NULL;if (

13、abigerb(numa ,numb)times = strlen(numa);/比較兩個(gè)字符串長(zhǎng)度,以大的作為循環(huán)次數(shù)else /交換位置以降低難度(times = strlen(numb);/讓數(shù)(字符串)長(zhǎng)的減去數(shù)(字符串)短的pna = findend(numb);/交換指針pnb = findend(numa);along=(int)strlen(numb);/標(biāo)記數(shù)字 a 的長(zhǎng)度;blong=(int)strlen(numa);/標(biāo)記數(shù)字 b 的長(zhǎng)度;isnegative=1;/標(biāo)記最后要加上負(fù)號(hào)while (times- & (times=0)| carry != 0)/carr

14、y != 0 說(shuō)沒(méi)有借位 時(shí)(if(!pstart-next)/如果當(dāng)前為空結(jié)點(diǎn),則申請(qǐng)新結(jié)點(diǎn)(pnew = new Node;pnew - data = 0;pnew - next = NULL;pnew - ahead = pstart;pstart - next = pnew;if(times data = -3 ;/讓它等于負(fù)號(hào)-/-3來(lái)源于負(fù)號(hào)與0相差3。break;else(if ( *pna = *pnb )/減數(shù)等于被減數(shù)時(shí)。結(jié)果等于直截相減的結(jié)果;并 置借位為0(if(carry=0)pstart - data = (*pna-48)-(*pnb-48); /111-11 的

15、情況else(pstart-data = (*pna-48)-(*pnb-48)+10 -carry;/1121T112carry=1;if( *pna *pnb )/減數(shù)大于被減數(shù)時(shí)。結(jié)果等于直截相減的結(jié)果;并置 借位為0(pstart - data = (*pna-48)-(*pnb-48)-carry; 存貯個(gè)位carry=0;else if( *pna 0) pstart-data = (*pna-48)-(*pnb-48)+10 -carry;/13-5 的情況作為新值else pstart-data = (*pnb-48)-(*pna-48) -carry; /3-5 作為當(dāng)前 的

16、新值carry=1;pstart = pstart - next;/結(jié)點(diǎn)移動(dòng)blong;if(blong0)pnb-;/指針移向被減數(shù)高位else*pnb=48;/之后相減就變?yōu)榱?0不作任何運(yùn)算,其實(shí)可以?xún)?yōu)化的。但代 碼會(huì)長(zhǎng)!而且還需要重新開(kāi)結(jié)點(diǎn)。所以放棄;pna-;/被數(shù)指針移動(dòng),if(isnegative=1)/加上負(fù)號(hào)處理。增加一長(zhǎng)度并置為負(fù)號(hào)(pnew = new Node;pnew - data = 0;pnew - next = NULL;pnew - ahead = pstart;pstart - next = pnew;pstart-data=-3;/因?yàn)閷ふ益湵淼慕Y(jié)尾點(diǎn)要統(tǒng)

17、一加48。又因?yàn)?是45。所以等于-3pstart =head;/尋找鏈表的結(jié)尾點(diǎn)while(pstart-next != 0)(pstart-data += 48;/! 逆順輸出pstart = pstart-next ;int tip = 0;/轉(zhuǎn)為字符串用clear0=0;/消除結(jié)果最前面無(wú)用的0 13-5 = 08的效果.修改 字符串的首指針pstart = pstart-ahead ;/找有效字while(pstart != 0)/輸出正序的結(jié)果;(if (clear0=0 & (int)pstart-data)=48&pstart-ahead!=0)/ 消除結(jié)果最前面無(wú)用的0;/不

18、輸出任何東西elseresulttip+ = pstart-data;if(int)pstart-data)!=48&(int)pstart-data)!=45)clear0=1;/ 號(hào)pstart = pstart-ahead ;resulttip = 0;pstart =head; 釋放空間while(pstart-next != 0)(pnew = pstart-next ;delete pstart;pstart =pnew;return ;2.3乘法運(yùn)算的實(shí)現(xiàn)首先說(shuō)一下乘法計(jì)算的算法,從低位向高位乘,在豎式計(jì)算中,我們是將乘數(shù)第一位與被乘 數(shù)的每一位相乘,記錄結(jié)果,之后,用第二位相乘

19、,記錄結(jié)果并且左移一位,以此類(lèi)推,直到計(jì) 算完最后一位,再將各項(xiàng)結(jié)果相加。得出最后結(jié)果。當(dāng)然我們可以直接用這種方法,但要用多個(gè) 鏈表來(lái)保存計(jì)算出的分結(jié)果,之后結(jié)果再相加得到最后結(jié)果,但是這樣會(huì)浪費(fèi)很多空間,我們 可以再優(yōu)化一下,就是只用一人鏈表來(lái)表示結(jié)果,先把第一位乘數(shù)與被乘數(shù)的結(jié)果保存在鏈表中, 之后把存儲(chǔ)結(jié)果的頭部后移一位、也就是從鏈表的第二加起,當(dāng)?shù)诙怀藬?shù)與被乘數(shù)結(jié)果加到第 二之后的各個(gè)項(xiàng)內(nèi)。以此類(lèi)推,直到結(jié)束。這樣就可以用一個(gè)鏈表來(lái)存儲(chǔ)相乘后的結(jié)果。在程序時(shí)應(yīng)注意:1、傳入的乘數(shù)和被乘數(shù)是以字符串形式放入的話(huà),要讓指針指向最后一位,我自己寫(xiě)了個(gè) 函數(shù)來(lái)完成這件事。鏈表傳入也要找到最后

20、一向來(lái)計(jì)算;2、因?yàn)閭魅牒捅4娴亩际亲址?,所以?jì)算時(shí)要將字符轉(zhuǎn)化為數(shù)字,算完再轉(zhuǎn)化為字符存儲(chǔ);3、另外進(jìn)位時(shí)要處理,當(dāng)前的值加上進(jìn)位的值再看本位數(shù)字是否又有進(jìn)位;4、輸出時(shí)要逆序輸出,因?yàn)殒湵硎字羔樖谴娴慕Y(jié)果的最低位。我的函數(shù)為了對(duì)應(yīng)輸入輸出 結(jié)果的一致性,都有采用了字符串輸出,所以在輸出時(shí)又將鏈表轉(zhuǎn)為了字符串。具體代碼如下:/*函數(shù)名稱(chēng):大數(shù)乘法*函數(shù)過(guò)程:1輸入兩個(gè)大數(shù)作為字符串2作一個(gè)雙向鏈表3兩個(gè)指針?lè)謩e指向數(shù)字字符串的最低位4以第一個(gè)數(shù)的最低的一個(gè)位乘以第二個(gè)數(shù)的所有項(xiàng)存于鏈表中5鏈表首指針移6重復(fù)4, 5依次從最低位乘到最高位7乘完后因?yàn)樽畹臀皇擎湵硎?,最后一位是鏈表尾。所以在逆?/p>

21、輸出鏈表。4直到循環(huán)結(jié)束*入口參數(shù):numa,numb,result 字符串*出口參數(shù):無(wú)*/void multiply(char *numa, char *numb ,char *result)/用來(lái)儲(chǔ)結(jié)果的)/ 計(jì)算乘積(char *pna = findend(numa);/指向 numa 的一個(gè)指針。point numa pna 指 向乘數(shù)的最低位,char *pnb = findend(numb);/指向 numb 的一個(gè)指針/pnb指向被乘數(shù)的最低位,一int along=(int)strlen(numa);/標(biāo)記數(shù)字 a 的長(zhǎng)度;int blong=(int)strlen(numb

22、);/標(biāo)記數(shù)字 b 的長(zhǎng)度;int carry=0,temp_result;/存貯進(jìn)位 和臨時(shí)結(jié)果的Node *head, /用于存貯頭指針*pstart, /用于存貯計(jì)算時(shí)的首指針*pnew,作于申請(qǐng)新結(jié)點(diǎn)*pgo;/作為每計(jì)算完一行時(shí),回到下一行起始節(jié)點(diǎn)用,移位標(biāo)致來(lái)用head = pstart =new Node;/初始化首結(jié)點(diǎn)和頭結(jié)點(diǎn)。pstart - data = 0;pstart - next = NULL;pstart - ahead = NULL;while (along-)(pgo = pstart;/保存進(jìn)位點(diǎn)blong = (int)strlen(numb);/初始化長(zhǎng)度

23、pnb = findend(numb); /初始化指針while (blong- & (blong=0)| carry != 0)(if(!pstart-next)/如果當(dāng)前為空結(jié)點(diǎn),則申請(qǐng)新結(jié)點(diǎn)(pnew = new Node;pnew - data = 0;pnew - next = NULL;pnew - ahead = pstart;pstart - next = pnew;if(blongdata+(*pna-48)*(*pnb-48)+carry);/ 自 身值 +新值+進(jìn)位作為新值pstart - data = temp_result%10; /存貯個(gè)位carry = temp_

24、result/10;/存貯進(jìn)位pstart = pstart - next;/結(jié)點(diǎn)移動(dòng)pnb-; /指針移向被乘數(shù)高位pstart = pgo-next; 前進(jìn)一個(gè)位置;pna-;/指針移向乘數(shù)高位pstart =head;/尋找鏈表的結(jié)尾點(diǎn)while(pstart-next != 0)(pstart-data += 48;/!逆順輸出pstart = pstart-next ;int tip = 0;/轉(zhuǎn)為字符串用pstart = pstart-ahead ;/找有效字while(pstart != 0)/輸出正序的結(jié)果;(resulttip+ = pstart-data;pstart =

25、pstart-ahead ;resulttip = 0;pstart =head; 釋放空間while(pstart-next != 0)(pnew = pstart-next ;delete pstart;pstart =pnew;return ;2.4除法運(yùn)算的實(shí)現(xiàn)首先說(shuō)一下我們所要的結(jié)果,當(dāng)除數(shù)除不開(kāi)被子除數(shù)時(shí),不用除到小數(shù),當(dāng)除數(shù)小于被除數(shù) 時(shí),除數(shù)作為余數(shù)既可,不用再向下除了。除法算法是最容易想到的啦!我們學(xué)數(shù)字電路,或模擬電路時(shí)里面有用門(mén)實(shí)現(xiàn)的除法器,做 法是用除數(shù)減被除數(shù),再用一個(gè)加法器去計(jì)算存儲(chǔ)結(jié)果,算法簡(jiǎn)單明了,結(jié)果我實(shí)現(xiàn)之后,計(jì)算 速度大大出乎我的遇料,比算乘方時(shí)還慢,經(jīng)仔

26、細(xì)想想電路中計(jì)算的長(zhǎng)度不過(guò)8位,16位,32 位,而且都是硬件實(shí)現(xiàn),我們要算的是幾千位,幾萬(wàn)位。特別是兩數(shù)位長(zhǎng)度差很大時(shí)計(jì)算速度相 當(dāng)慢,如10000-3時(shí)要進(jìn)行多少次鏈表運(yùn)算啊。否定了這條算法,經(jīng)不斷思考,發(fā)現(xiàn)另一種方法可行,且效率僅次于減法。就是從高位向低 位減,減時(shí)以被除數(shù)長(zhǎng)度為單位,從高位取出大于被除數(shù)的字符串,和被除數(shù)相減,減的次數(shù)為 結(jié)果,余數(shù)從剩下的除數(shù)高位再取出幾位做補(bǔ)位,直到大于被除數(shù)。再減,循環(huán)減到被減數(shù)大于 余數(shù)加上補(bǔ)位,那么這個(gè)新的余數(shù)作為結(jié)果返回。在程序時(shí)應(yīng)注意:1、除法算法計(jì)算時(shí)是用的最高位開(kāi)始向低位減,所以要注意指針的位置。2、余數(shù)和被減數(shù)相減時(shí),一定要注意:一旦

27、能夠減開(kāi)被除數(shù)時(shí),一定要每從除數(shù)那里取一個(gè)字符時(shí),結(jié)果也要對(duì)應(yīng)補(bǔ)一個(gè)0。如111222/111。/*函數(shù)名稱(chēng):大數(shù)除法2-*函數(shù)想法:1用指針指向除數(shù)的最高位,保存臨時(shí)字符串;tempstra+ = pna2如果臨時(shí)字符串大于被除數(shù),則相減。結(jié)果等于余數(shù)if(tempstrnumb)tempstr = tempstr - numb3如果小于被除數(shù)且指針到頭,余數(shù)等于臨時(shí)字符串if(tempstr *入口參數(shù):numa,numb,result,remainder 字符串*出口參數(shù):無(wú)*/void divide2( char *numa, char *numb,char *result,char

28、*remainder)/計(jì)算除法2(char one二1;/ 臨時(shí)字符串.char one2=1;/char zero=0;/char numb26048;/char tempstr6018=;/臨時(shí)字符串int ia=0,ia2=0;/tempstr 的指示器bool moveon=false;/翻轉(zhuǎn)牌pna指向減/pnbchar *pna = numa;/f指 向 numa 的一個(gè)指針。point numa 數(shù)的最低位,char *pnb = findend(numb);/指向 numb 的一個(gè)指針指向被減數(shù)的最低位,Node *head, /用于存貯頭指針*pstart, /用于存貯計(jì)算

29、時(shí)的首指針*pnew;作于申請(qǐng)新結(jié)點(diǎn)head = pstart =new Node;/初始化首結(jié)點(diǎn)和頭結(jié)點(diǎn)。pstart - data = 0;pstart - next = NULL;pstart - ahead = NULL;moveon = false;while(*pna)(if(!pstart-next)/如果當(dāng)前為空結(jié)點(diǎn),則申請(qǐng)新結(jié)點(diǎn)(pnew = new Node;pnew - data = 0;pnew - next = NULL;pnew - ahead = pstart;pstart - next = pnew;ia=(int)strlen(tempstr);/取的長(zhǎng)度te

30、mpstria+ = *(pna+);tempstria =0; /轉(zhuǎn)換為字符串if(tempstr0=0)/處理高位也是0的那種 如00(ia2=0;while(tempstria2=0)+ia2;while(ia2=1)/清除無(wú)用的 0(ia=ia2-1;tempstria=tempstria2;-ia2;tempstr+ia2=0;while(abigerb(tempstr,numb)0)/如果 tempstr 大于等于 numb(if(tempstr0=0)/處理高位也是0的那種 如00-此乃冗余代碼,留 做記念用(ia2=0;while(tempstria2=0)+ia2;if(ia

31、=ia2 )(moveon = true;break;strcpy(numb2,numb);subtract(tempstr, numb,tempstr);/A-Bstrcpy(numb,numb2);if(tempstr0=-)/若判斷的不準(zhǔn),變?yōu)榱素?fù)數(shù)就再加上B。(strcpy(numb2,numb);addition(tempstr, numb,tempstr);/A-Bstrcpy(numb,numb2);ia2=0; 修正之后的長(zhǎng)度。因?yàn)榧臃ㄖ形醋鲐?fù)數(shù)運(yùn)算ia=0; /為了消除最后的那一個(gè)負(fù)號(hào),整體向前移動(dòng)。while(tempstria2!=0)+ia2;while(ia2=1)/

32、清除無(wú)用的 0(tempstria=tempstria+1;+ia;-ia2;tempstria=0;moveon = true;break;pstart-data+ ; 結(jié)果自加 moveon = true;if(moveon) pstart = pstart - next;/結(jié)點(diǎn)移動(dòng)strcpy(remainder,tempstr);/存貯余數(shù)int tip = 0;/轉(zhuǎn)為字符串用pstart =head;/尋找鏈表的結(jié)尾點(diǎn)while(pstart-next != 0)(pstart-data += 48;/! 逆順輸出resulttip+ = pstart-data;pstart = p

33、start-next ;resulttip = 0;/存貯結(jié)果pstart =head; 釋放空間while(pstart-next != 0)(pnew = pstart-next ;delete pstart;pstart =pnew;return ;2.5冪運(yùn)算的實(shí)現(xiàn)冪的實(shí)現(xiàn)是最為簡(jiǎn)單的了,國(guó)為有了前面的算法做鋪墊,就是調(diào)用乘法函數(shù),來(lái)循環(huán)去自乘, 冪指數(shù)相應(yīng)減1,直到冪指數(shù)變?yōu)?時(shí)結(jié)束。其詳細(xì)代碼如下:/*函數(shù)名稱(chēng):大數(shù)冪*函數(shù)想法:1 B自減1直到,作為循環(huán)控制變量.保存結(jié)果;2結(jié)果初值1每次乘以A3重復(fù)1、2步驟到結(jié)束.*入口參數(shù):numa,numb,result 字符串*出口參數(shù):無(wú)*/void power (char *numa, char *numb,char *result) /計(jì)算冪( char one=1; /臨時(shí)字符串.char one2=1;char zero=0;char numb26048;char remainder6048;strcpy(result,one); /給結(jié)果初值為 1strcpy(numb2,numb);subtract(numb,one ,rema

溫馨提示

  • 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)論