最近遇到一道求階乘的題目,原以為極其簡單,但是階乘的結果超過了範圍最大的基本資料型別的範圍,於是就著手研究大數運算(large number computing),本篇先介紹大數加法。
大數運算的原理其實就是模擬人工計算(註記:再考慮是否有其他演算法。註記日期:2017.3.19),人工加法計算步驟如下:
1.將兩個運算元(operand)位數對齊。
2.從最低位開始,計算兩個運算元每位的總和再加上進製數(第一位數為0)的結果,保留其個位數。
3.若上述的結果大於10,進製數置為1,否則為0。(每位數相加的結果不會超過 9 + 9 = 18 , 因此進製數只有1和0)
4.重複上述步驟2、3,直到計算完兩個運算元其中那個位數小的最高位。
知曉了步驟,就需要考慮設計儲存運算元的資料結構。首先使用列表是毋庸置疑的,而順序結構和鍊錶結構其實都行,這裡為里減少**量和說明問題,暫且使用順序結構。
綜上,給出運算元的結構體如下:
1 typedef structoperand
2 operand;
注意,這裡給出最大位數為100,下面給出的**中沒有考慮溢位問題,請讀者自行解決。
首先,思考上述步驟1的對齊問題,可以定義乙個偏移量(offset)來儲存兩個運算元的位數之差,之後遍歷的時候可以給位數少的增加偏移量來達到對齊目的。可是這種做法會增加一定的**量,因此不妨試著把數字倒著存放,即陣列第乙個元素儲存運算元的最低位(注意前述做法的前提與此相反),這樣做就省去了寫對齊的**。
下面給出該出加法函式,其中結果儲存到第乙個運算元中:
1void plus(operand* operand1,operand*operand2)
212 operand1->digit = (operand1->digit > operand2->digit)?
13 operand1->digit : operand2->digit ;
14//
更新位數
15if(carry) //
若最後需要進製
1620 }
其中,sum % 10 用於求個位數,還有注意最後別忘了最高位的進製問題。
大數運算 加法
include include include void add const char a,const char b,char c if carry 0 result result length carry 0 while result length 0 c result result length...
大數運算 加法
究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位元組,取值0或1。bool型為int型,一般認為佔4個位元組,取值true false error。sbyte型為有符號8位整數,佔1個位元組,取值範圍在128 127之間。bytet型為無符號16位整數,佔2個位元組,取值範圍在...
大數運算 加法減法
第一篇博文有點小雞凍。在哈工程寒假集訓中第一次模擬中唯一一道對我有價值的題就是大數加法,隨後的幾次模擬中大數運算不斷,可見這是我們必須掌握的技能,本人智商較低,先講解下大數加法減法,乘除階乘或者結合其他知識的大數運算日後定會奉上。究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位...