大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。
一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。
階乘問題比較典型,下面,將通過自己的學習逐步介紹。
首先介紹兩種常規方法。
[cpp]view plain
copy
/* 利用 迭代 來計算整數n的階乘 */
#include
intmain()
printf("%ld"
,result);
return
0;
}
[cpp]view plain
copy
/* 利用 遞迴 來計算整數n的階乘 */
#include
long
factorial_recursion(
intn )
else
} intmain()
這兩種方法都比較常規,也比較簡單,初學c的時候,還沒接觸演算法,就是利用這樣的思路完成。
但是,一旦求n!中n的值大了,那麼不管是int 還是 long 都無法滿足。這時候就涉及到大數處理的問題上了。
下面介紹常規的大數階乘。
[cpp]view plain
copy
#include
intmain()
while
(carry)
} printf("n ! = "
);
//顯示結果
for(j = digit; j >=1;j--)
printf("\n"
);
return
0;
}
這種大數階乘演算法也比較常規,目前水平能看懂。
具體思路**中的注釋也比較詳細,就不重複了。 還是模擬筆算的過程。
下面附帶兩個大牛的演算法 , 雖然現在還看不懂,但是先mark一下。以後慢慢琢磨。
出處 :
[cpp]view plain
copy
#define n 400
long
a[8916]=,n,i,c,len;
intmain(
void
)
((a[i]=c)>0)?len++:0;
}
for( len--,printf(
"%d"
,a[len--]);len>=0; len--) printf(
"%04d"
,a[len]);
return
0;
}
【解釋】
for ( len=1;n>1; n--) //把len的長度初始為1,因為陣列中已經有乙個元素了a[0]=1
((a[i]=c)>0)?len++:0; //最後乙個元素也有進製嗎,有的話就在當前的元素的下個陣列位置直接等於進製值,並
// 且陣列的元素值 要加1,沒有的話什麼都不幹 ,光乙個0什麼都不是
}出處:
[cpp]view plain
copy
inta[100000]=,n,i,c,m=1;
main()
for(;m;)
putch(a[--m]+48);
}
另外,網上關於大數階乘的討論也比較多。我也google了一些,學習後,感覺下面幾個比較有意義。
還是先mark下。 便於以後溫習。
高精度大資料 階乘計算
問題描述 輸入乙個正整數n,輸出n 的值。其中n 123 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的...
4 大數,高精度計算 大數加法
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。思路很常規。先用字...
6 大數,高精度計算 大數乘法
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。大數乘法,相對之前...