我來提供一個不用乘法的 N! 好了,
你們可以發現, 算 9! 只要 36 個加法就夠了.
不過, 算 100! (如果你們的 int 位數可以特別大) 要 4950 個加法.
main()
{
int i, j, k, l = 1, n;
scanf("%d", &n);
for(i = 1; i <= n; i++)
for(j = 1, k = l; j < i; j++)
l += k;
printf("%d! = %d\n", n, l);
}
最快的方法是......查表法 :)
int array[] = { 1, 1, 2, 6, 24, 120, 720,......
==> 在 bluce.bbs@bbs.cs.nccu.edu.tw (我想看看妳歐) 的文章中提到:
: 主旨: 在工程領域中, 常有機會用到階乘(factorial)的計算, 本次的
: 程式設計習題,可用來求得二項式係數或泰勒展開式係數...
: 옡
: 說明: 以下將題目分為四個層級, 後三個稍微超出範圍, 因此視為
: bonus 關卡, 請依程度及興趣擇一而作, 程式的要求如下:
: I/P: 提示輸入字串, 詢問並取得欲求之階乘, 可選擇使用
: printf(),scanf() 或 argc,argv[][] 皆可
: O/P: 顯示運算結果, 若是以turbo c編譯, 建議將輸出變數
: 設為 long int(32 bits)
: (1)入門級: 以 for loop 達成目標
: (2)標準級: 將演算方法包裝成 function, 使之可以求組合數如 C(8,4)
: (3)進階級: 以遞迴式(recursive), 使函式呼叫自己來完成運算結果
: 提示: 函式內的變數可能需要用到 static int 的宣告
: (4)挑戰級: 一般來說,無內建乘法器的 CPU,在做乘法運算時的效率不彰,
: 因此若能減少乘號的出現次數便可大幅提升計算速度
: 提示: 9! = 9 * C(8,4) * [(4!)^2] 且
: 4! = C(4,2) * [(2!)^2] 代入上式
: 從原本的 9! ->4! ->2! 減少了乘法的次數
: 當所求的數愈大, 減少的幅度愈是驚人!
: 並且其中的 C(n,n/2) 可由(2)求得
: 極度挑戰! 你能找到更快的方法嗎?
--
奶奶: "哇, 你們看, 你們看, 電視裏面那些怪獸好可怕啊......"
弟弟: "阿媽, 不是啦, 那些是恐龍, 可是都是假的啦 :) "
奶奶: "阿那是假的, 那些人為什麼要跑? 還跑得那麼喘! "
弟弟: ......@#$%...... (和民國前的人溝通真是困難......)