說明:基於記憶體的有效運用,程式語言中規定了各種不同的資料型態,也因此變數所可以表達的最大整數受到限制,例如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***************************