7 超長整數運算(大數運算)

說明:基於記憶體的有效運用,程式語言中規定了各種不同的資料型態,也因此變數所可以表達的最大整數受到限制,例如123456789123456789這樣的 整數就不可能儲存在long變數中(例 如C/C++等) ,我們稱這爲long數,這邊翻爲超長整數(避免與資料型態的長整數翻譯混淆)或,俗稱大數運算。 

解法:一個變數無法表示超長整數,則就使用多個變數,當然這使用陣列最爲方便,假設程式語言的最大資料型態可以儲存至65535的數好了, 爲了計算方便及符合使用十進位制的習慣,讓 每一個陣列元素可以儲存四個位數,也就是0到9999的數,例如:


很多人問到如何計算像50!這樣的問題,解法就是使用程式中的乘法函式,至於要算到多大,就 看需求了。 

由於使用陣列來儲存數值,關於數值在運算時的加減乘除等各種運算、位數的進位或借位就必 須自行定義,加、減、乘都是由低位數開始運算,而除法則是由高位數開始運算,這邊直接提 供加減乘除運算的函式供作參考,以下的N爲陣列長度。

************************************程序片段********************************

void add(int *a,int*b,int *c){

         int i, carry = 0;

         for(i =N - 1; i >= 0; i --){ 

                   c[i] = a[i] + b[i] + carry; 

                   if(c[i] < 10000)

                           carry = 0; 

                  else {// 進位

                           c[i] = c[i] - 10000;

                           carry = 1;

                  }

         }

}

 

void sub(int *a,int*b,int *c){

                   int i, borrow = 0;

                  for(i = N - 1; i >= 0; i --){ 

                           c[i] = a[i] - b[i] - borrow; 

                           if(c[i] >= 0) 

                                borrow = 0;

                           else { // 借位

                                c[i] = c[i] + 10000;

                                borrow = 1; 

                           }

                 }

}

 

void mul(int *a,int b,int *c){ // b 爲乘數

                int i, tmp,carry = 0;

                for(i = N - 1; i >=0;i --){ 

                         tmp = a[i] * b + carry; 

                        c[i] = tmp % 10000; 

                        carry = tmp / 10000; 

              }

}

 

void div(int *a,int b,int *c){ // b 爲除數 

            int i, tmp,remain = 0; 

           for(i = 0; i < N; i++){ 

                     tmp = a[i] + remain; 

                     c[i] = tmp / b; 

                     remain = (tmp % b) * 10000; 

          }

}

 

***************************************END***************************




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章