大數的運算思想

2021-06-29 14:14:17 字數 1868 閱讀 7055

大數計算的因數和結果精度一般是少則數十位,多則幾萬位。在c/c++語言中定義的型別中精度最多只有二十多位,因而我們採取用鍊錶存貯的方式來存放大數。在計算中會用到從高位開始計算,和從低位開始計算數值的兩種情況。所以我們將鍊錶定義為雙向鍊錶,其中為乙個單元來存貯資料,乙個指標指向前方的資料,另乙個指向後的資料。其結構為:

struct node  // 定義乙個雙向鍊錶用來存貯結果

1、必須判斷出運算元a、b的長度,以位長的乙個作為迴圈基礎。

2、最後一位(最高位)的運算中,若進製不為0,則需增設多乙個儲存結點。

演算法也是從低位開始減。先要判斷減數和被減數那乙個位數長,減數字數長是正常減;被減數字數長,則被減數減減數,最後還要加上負號;兩數字數長度相等時,最好比那乙個數字大,否則負號處理會很繁瑣;處理每一項時要,如果前一位相減有借位,就先減去上一位的借位,無則不減,再去判斷是否能夠減開被減數,如果減不開,就要借位後再去減,同時置借位為1,否則置借位為0。

處理中注意的問題:

1、如果被減數大於減數時,指標和相應迴圈長度控制變數也要做相應的修改 

2、結果可能會出現前面是一堆0的情況,要處理好,如當減數為112,而被減數為111時,會出現001 

首先說一下乘法計算的演算法,從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果,之後,用第二位相乘,記錄結果並且左移一位,  以此類推,直到計算完最後一位,再將各項結果相加。得出最後結果。當然我們可以直接用這種方法,但要用多個鍊錶來儲存計算出的分結果, 之後結果再相加得到最後結果,但是這樣會浪費很多空間。

只用乙個鍊錶來表示結果,先把第一位乘數與被乘數的結果儲存在鍊錶中,之後把儲存結果的頭部後移一位、也就是從鍊錶的第二加起,當第二位乘數與被乘數結果加到第二之後的各個項內。以此類推,直到結束。這樣就可以用乙個鍊錶來儲存相乘後的結果。

處理中注意的問題:       1、傳入和儲存的都是字元,所以計算時要將字元轉化為數字,算完再轉化為字元儲存

2、另外進製時要處理,當前的值加上進製的值再看本位數字是否又有進製;

3、 輸出時要逆序輸出,因為鍊錶首指標是存的結果的最低位。函式為了對應輸入輸出結果的一致性,都有採用了字串輸出,所以在輸出時又將鍊錶轉為了字串

首先說一下我們所要的結果,當除數除不開被子除數時,不用除到小數,當除數小於被除數時,除數作為餘數既可,不用再向下除了。

除法演算法最容易想到的數位電路,或模擬電路時裡面有用門實現的除法器,做法是用除數減被除數,再用乙個加法器去計算儲存結果,演算法簡單明瞭,計算速度比算乘方時還慢,電路中計算的長度不過8位,16位,32位,而且都是硬體實現,現要算的是幾千位,幾萬位。特別是兩數字長度差很大時計算速度相當慢,如10000-3時要進行多少次鍊錶運算啊。

就是從高位向低位減,減時以被除數長度為單位,從高位取出大於被除數的字串,和被除數相減,減的次數為結果,餘數從剩下的除數高位再取出幾位做補位,直到大於被除數。再減,迴圈減到被減數大於餘數加上補位,那麼這個新的餘數作為結果返回。

處理中注意的問題:    1/  除法演算法計算時是用的最高位開始向低位減,所以要注意指標的位置。

2/餘數和被減數相減時,一定要注意:一旦能夠減開被除數時,一定要每從除數那裡取乙個字元時,結果也要對應補乙個0。如111222/111

冪的實現是最為簡單的了,國為有了前面的演算法做鋪墊,就是呼叫乘法函式,來迴圈去自乘,冪指數相應減1,直到冪指數變為0時結束。

大資料思想

1 大根堆 插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。取走堆頂元素 堆中每次都刪除第0個資料。為了便於重建堆,實際的操作是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。2 小根堆 同上如何在海量資料中找出重複最多乙個。上億有重資料,統計最多前n個...

大數的運算

大數運算指的是對c語言中那些大到超出表示範圍的數的運算,比如9999999999999999999999999999999 9999999999999999999999999。c語言中無法將這麼大的乙個數儲存到變數中,這裡就要用到大數的運算了。大數加法 思路很簡單,就是把這個 大數 以字串的形式存入...

大數的運算

原理在 的注釋裡。include include include intcompare char a,char b 編寫函式比較兩個大數大小。a b返回1,a b返回0,a return0 void add char a,char b,char c 實現兩個大數相加 a1 i 0 i if l 0 ...