[問題] 關於組合的演算法...(考慮溢位)

看板C_and_CPP (C/C++)作者 (Alfred)時間14年前 (2012/04/21 22:27), 編輯推噓7(7015)
留言22則, 8人參與, 最新討論串1/2 (看更多)
如題 我想做出一個組合C(m,n)->(m取n m>n>0)的程式 由於要考慮溢位問題 所以一般用兩個正數變數做運算是不可行的 以下是我的想法 請各位看看可不可行 1.假設是C(100,40) 判定n 跟m-n 的大小 若是(m-n)<n 則m-n 取代n 反之n不變 2.依照組合公式 將分母與分子的乘數分別放入等長的陣列內 如:分母[0] = 100 分子[0] = 40 分母[1] = 99 分子[1] = 39 ... 分母[39] = 61 分子[39] = 1 3.用分子逐一尋找可整除之分母數 達到消去的效果 如:分母[58] % 分子[0] = 0 // 80 % 40 = 0 分母[58] = 商 分子[0] = 1 當所有的分子都消一輪後 剩餘不等於1的分子 用最大公因數(遞迴的函數 在此省略)消掉 4.將沒被消掉的分母乘起來 乘的方式為: 1)創一個長度為100的整數陣列 ans[100] 2)將分母陣列一個個值依序乘並放入ans陣列 3)每當ans[n]裡的值>10就要將多的數字進位到ans[n+1]裡 目前遇到的問題: 步驟3(分子尋找合適的分母) 和 4 都還是會造成高時間複雜度 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.116.178

04/21 23:16, , 1F
好三角形不用嗎?
04/21 23:16, 1F

04/22 00:12, , 2F
有看沒有懂,感覺原PO把他複雜化了
04/22 00:12, 2F

04/22 00:17, , 3F
不考慮處理速度的話,直接大數乘除就好了
04/22 00:17, 3F

04/22 00:19, , 4F
m如果不限制大小,不溢位很難,一個巨大的質數塞進去就爆了
04/22 00:19, 4F

04/22 00:20, , 5F
原po的考量是否指的是盡量不溢位?
04/22 00:20, 5F

04/22 00:21, , 6F
如不溢位是必要條件,可能如同s大說的,用大數運算比較妥
04/22 00:21, 6F

04/22 00:30, , 7F
第3點還滿蝦的,因為一定可以找到分子*2的分母
04/22 00:30, 7F

04/22 00:31, , 8F
跟本不用什麼最大公因數吧??完全看不懂= ="
04/22 00:31, 8F

04/22 00:34, , 9F
是分子*N的分母,其實沒那麼高時間複雜度
04/22 00:34, 9F

04/22 00:36, , 10F
分子*2的分母,不一定找得到喔!例如C10取3
04/22 00:36, 10F

04/22 00:37, , 11F
你先訂出m跟n的值域再來討論吧...
04/22 00:37, 11F

04/22 00:37, , 12F
印象中ACM寫過類似題
04/22 00:37, 12F

04/22 00:38, , 13F
大多數的情況int64都可以直接搞定
04/22 00:38, 13F

04/22 00:59, , 14F
你可以先對分子/分母進行質因式分解,如果先建立質數表,
04/22 00:59, 14F

04/22 00:59, , 15F
效能會再往上拉一些。
04/22 00:59, 15F

04/22 01:02, , 16F
之前有用double硬幹過, 分子分母一一配對結果先做出來
04/22 01:02, 16F

04/22 01:03, , 17F
然後再逐個乘上去最後round成整數
04/22 01:03, 17F

04/22 03:48, , 18F
原po問題應該是在於結果不溢位,但計算過程會溢位吧
04/22 03:48, 18F

04/22 03:50, , 19F
其實1樓f大已經說了.. 用巴斯卡三角形來解
04/22 03:50, 19F

04/22 03:52, , 20F
好用特性 C(m,n) = ΣC(k,n-1) , k=(n-1)...(m-1)
04/22 03:52, 20F

04/22 03:54, , 21F
要加速的話就把某一層的結果都先算出來放在程式裡
04/22 03:54, 21F

04/27 20:51, , 22F
感謝解答=.= 原來帕斯卡就可以了...
04/27 20:51, 22F
文章代碼(AID): #1FaiEqNV (C_and_CPP)
文章代碼(AID): #1FaiEqNV (C_and_CPP)