開發環境:Visual C++ 2010 sp1 with FFTW
在電腦中,無法將一個很大的數字存入一個變數裡面,
譬如說: 2^100000,這樣子的數字完全無法使用如:int,float,double,long,long long...來儲存,
那麼勢必要把這一大串的數字擺放於陣列,
要怎麼擺放呢?這裡有一個很簡單的方式,
以10進位的數字來講,把每一個位數(digit)都用一個int來儲存,
例如: 12345(in decimal) 以陣列的方式儲存就會是:(以最高位元為優先)
以我個人會是以最低為元優先來做儲存,主要原因在於做四則運算時要對齊位元的位置,
以及進位的問題,
假設有兩個數字要相加,分別為: 11111與99999,
以最高位元為優先的表示方法就會是:
然而,使用最低位元優先的時候,code大概可以寫成
現在來比較兩邊的code,上面的code要多一個if來判斷最後的進位,
而且最後進位的時候還要做記憶體搬移的工作,基於以上的原因,
往後我寫的大數程式碼都會是以"最低位元優先"的儲存方式來撰寫。
P.S.: 三點了,該是好孩子上床睡覺的時候了 XD
To be continued...
在電腦中,無法將一個很大的數字存入一個變數裡面,
譬如說: 2^100000,這樣子的數字完全無法使用如:int,float,double,long,long long...來儲存,
那麼勢必要把這一大串的數字擺放於陣列,
要怎麼擺放呢?這裡有一個很簡單的方式,
以10進位的數字來講,把每一個位數(digit)都用一個int來儲存,
例如: 12345(in decimal) 以陣列的方式儲存就會是:(以最高位元為優先)
int x[] = { 1 , 2 , 3 , 4 , 5 } ;也可以把數值以最低為元優先而存成:
int x[] = { 5 , 4 , 3 , 2 , 1 } ;
以我個人會是以最低為元優先來做儲存,主要原因在於做四則運算時要對齊位元的位置,
以及進位的問題,
假設有兩個數字要相加,分別為: 11111與99999,
以最高位元為優先的表示方法就會是:
int a[6] = { 1 , 1 , 1 , 1 , 1 , 0} ; int b[6] = { 9 , 9 , 9 , 9 , 9 , 0} ;假設 a_len 為a的位元數,b_len 為a的位元數, 那兩數相加的時候,code大概要寫成
int maxCarry = 0 ; int tmp = a_len ; while ( a_len-- >= 0 ) { if ( b_len -- >= 0 ) a[a_len] += b[b_len] ; if ( a[a_len] > 9 ) { if ( a_len > 0 ) { //如果陣列前面還有位置可以存 a[a_len-1] += a[a_len] / 10 ; } else { //如果沒有了,暫存到另一個變數 maxCarry = a[a_len] / 10 ; } a[a_len] %= 10 ; } } if ( maxCarry ) { //如果最後還有進位 //把原先a的資料存到最大位數的後面那個位數 memset( a + 1 , a , tmp ) ; //將進位數字填回去第一個位數 a[0] = maxCarry ; }
然而,使用最低位元優先的時候,code大概可以寫成
//Given a_len >= b_len for ( int i = 0 ; i < a_len ; i++ ) { a[i] += b[i] ; if ( a[i] > 9 ) { a[i+1] += a[i] / 10 ; a[i] %= 10 ; } }
現在來比較兩邊的code,上面的code要多一個if來判斷最後的進位,
而且最後進位的時候還要做記憶體搬移的工作,基於以上的原因,
往後我寫的大數程式碼都會是以"最低位元優先"的儲存方式來撰寫。
P.S.: 三點了,該是好孩子上床睡覺的時候了 XD
To be continued...
沒有留言:
張貼留言