[問題] 關於overflow

作者: joshua049 (qwertyuiop)   2016-10-12 22:57:41
小弟我今天碰到一個題目
假如輸入n
要輸出(X+1)的n次方展開後的係數
例如: 3→1 3 3 1
4→1 4 6 4 1
那我看到這個題目的第一個反應就是Cn取k的公式
所以就是利用階乘的方式
寫出第一支程式碼
http://i.imgur.com/r5Z0AOR.jpg
前面幾筆測資都是正確的
但是到後面數字越來越大
就會出現overflow的情況(大概在13附近)
後來我改用Cn取k=C(n-1)取(k-1)+C(n-1)取k這個遞迴式
另外寫了一個函式
讓整個精簡一點
http://i.imgur.com/3Q56AGR.jpg
後來所有的測資就都通過了(1~30)
想請問像這種情況
明明數字大小都一樣
為甚麼第一種寫法會overflow呢?
作者: pttworld (批踢踢世界)   2016-10-12 23:22:00
*
作者: steve1012 (steve)   2016-10-12 23:57:00
乘法長很快
作者: Raymond0710 (雷門)   2016-10-13 00:12:00
13! 算算看是多少 int 界線又是多少
作者: pttworld (批踢踢世界)   2016-10-13 00:29:00
+
作者: a27417332 (等號卡比)   2016-10-13 00:56:00
推同學,看題目就在猜ip是不是114 XD
作者: LPH66 (-6.2598534e+18f)   2016-10-13 01:35:00
主要其實不是乘跟加, 而是組合數做法的中間結果會先變大再變小, 變大的過程中間就有可能溢位
作者: Chikei ( )   2016-10-13 01:36:00
因為遞迴不用很大的數字除很大的數字,一路小數字加上去
作者: LPH66 (-6.2598534e+18f)   2016-10-13 01:36:00
只是乘法的這個過程加速很快而已事實上組合數做法也是有不溢位的算法的只是相對的就複雜很多遞迴的做法只有加沒有減, 所以如果溢位就是結果真的太大
作者: Schottky (順風相送)   2016-10-13 02:10:00
認親 XD
作者: Sylveon (仙子精靈)   2016-10-13 04:54:00
114來競程玩R,有Cn取m的強化版
作者: pttworld (批踢踢世界)   2016-10-13 08:44:00
實際是結果不破,怎麼加都可以。乘配合除縮小則爆。硬要寫乘,可以是迴圈內每乘一個數字就判斷是否可除。

Links booklink

Contact Us: admin [ a t ] ucptt.com