昨日の続きですが、同じものを含む順列を生成してカウントするんじゃなくて、数学の組合せの公式を使って解いてみました。(^_^;
簡単な問題をわざわざ難しい方法で解くのも乙なものですが、初めからこちらの方法で解いておけば良かったかな。(^_^;
Pythonでは、ExcelのPERMUT関数やCOMBIN関数のような順列や組合せの総数自体を求める関数が初めから用意されていなのは意外でした。(^_^;
● RWBalls3.py
# coding: UTF-8 # RWBalls3.py import math # 階乗 n! def fact(n): return math.factorial(n) # 順列 nPr def perm(n,r): return fact(n)/fact(n-r) # 組合せ nCr def comb(n,r): return perm(n,r)/fact(r) def main(): from time import time tm=time() # Timer Start total = 0 for n in range(10+1): s = 'r'*n+'|||' subTotal = comb(len(s),3) total+=subTotal print("%13s :%5d"%(s,subTotal)) print("%11s :%5d"%(u"合計",total)) tm=time()-tm # Timer Stop print("Runtime : %.3f [sec]"%tm) if __name__ == '__main__': main()
●実行結果
||| : 1 r||| : 4 rr||| : 10 rrr||| : 20 rrrr||| : 35 rrrrr||| : 56 rrrrrr||| : 84 rrrrrrr||| : 120 rrrrrrrr||| : 165 rrrrrrrrr||| : 220 rrrrrrrrrr||| : 286 合計 : 1001 Runtime : 0.000 [sec]
※参考URL
●順列・組合せ - 高精度計算サイト
●知恵袋で見つけた赤玉と白玉の組分けの問題をPythonで解いてみた。
●知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみた。(2)