精華區beta Programming 關於我們 聯絡資訊
我來提供一個不用乘法的 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)求得 : 極度挑戰! 你能找到更快的方法嗎? -- 奶奶: "哇, 你們看, 你們看, 電視裏面那些怪獸好可怕啊......" 弟弟: "阿媽, 不是啦, 那些是恐龍, 可是都是假的啦 :) " 奶奶: "阿那是假的, 那些人為什麼要跑? 還跑得那麼喘! " 弟弟: ......@#$%...... (和民國前的人溝通真是困難......)