[问题] 关于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