看板 C_and_CPP 關於我們 聯絡資訊
小弟我今天碰到一個題目 假如輸入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呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.221.131 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1476284266.A.7CE.html
pttworld: * 10/12 23:22
steve1012: 乘法長很快 10/12 23:57
什麼意思?? ※ 編輯: joshua049 (140.114.221.131), 10/13/2016 00:02:21 ※ 編輯: joshua049 (140.114.221.131), 10/13/2016 00:03:28
Raymond0710: 13! 算算看是多少 int 界線又是多少 10/13 00:12
摁摁 那為甚麼用遞迴的方式就不會爆呢 ※ 編輯: joshua049 (140.114.221.131), 10/13/2016 00:17:52
pttworld: + 10/13 00:29
a27417332: 推同學,看題目就在猜ip是不是114 XD 10/13 00:56
LPH66: 主要其實不是乘跟加, 而是組合數做法的中間結果 10/13 01:35
LPH66: 會先變大再變小, 變大的過程中間就有可能溢位 10/13 01:35
Chikei: 因為遞迴不用很大的數字除很大的數字,一路小數字加上去 10/13 01:36
LPH66: 只是乘法的這個過程加速很快而已 10/13 01:36
LPH66: 事實上組合數做法也是有不溢位的算法的 10/13 01:36
LPH66: 只是相對的就複雜很多 10/13 01:36
LPH66: 遞迴的做法只有加沒有減, 所以如果溢位就是結果真的太大 10/13 01:37
歐歐我想通了 感謝各位!!!!
Schottky: 認親 XD 10/13 02:10
Sylveon: 114來競程玩R,有Cn取m的強化版 10/13 04:54
我開學去聽過了,聽到崩潰XDDDD
pttworld: 實際是結果不破,怎麼加都可以。乘配合除縮小則爆。 10/13 08:44
pttworld: 硬要寫乘,可以是迴圈內每乘一個數字就判斷是否可除。 10/13 08:47
※ 編輯: joshua049 (140.114.221.131), 10/13/2016 09:32:48