初めての店舗開業を成功させよう>>

n≒1000くらいまでコンビネーションnCkを計算できるプログラムを作ろうと思っています。
階乗を使った公式では直ぐに破綻してしまうので
7C3=(7・6・5)/(3・2・1)とやるようなプログラムを組んだのですが
希望より小さなnで破綻してしまいます。
とりあえず、今は7C3=(7/3)・(6/2)・(5/1)とやるような計算法で凌いでいますが
途中で実数計算(整数計算でないという意味)をせざるを得ず、ちょっと気持ち悪いです。
究極のプログラムを組もうという気は無いのですが
もう少し現状を改善したいと思っています。

良きアドバイスをいただけたら幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (11件中11~11件)

nが1000まで行くと二項係数は300桁くらいになってしまうので、そもそ


も計算値を表示できるのかわかりませんが。
1000までならば、1から1000を素因数分解するのは簡単だと思うので、
分子と分母を素因数分解して、分子のうち、分母に現れない素因数の
部分と、分母に現れる素因数の場合は指数の差をとって掛けたものを
計算すればよいとは思います。
つまり、
分子=p1^a1・・・pk^ak・q1^b1・・・qi^bi
分母=p1^c1・・・pk^ck
となるときは、
p1^(a1-c1)・・・pk^(ak-ck)・q1^b1・・・qi^bi
を計算するといった具合です。
これで、指数の部分が小さくなるのである程度爆発は防げる気はします。
分子・分母の素因数とその指数を配列で持たしておいて、ソートして
比較するとかして出来る気はします。
ソフトが何なのか分かりませんけど。
実際やってみたわけではなく、自分でVBAでやるとしたらこうするか
な、と考えたまでです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルでnCr (組み合わせ)の作成方法

どなたかご存じでしたら回答願います。
ミニロトとロト6をエクセルを使用して予想に利用しております。
その中で知りたいのは、下記の場合のエクセルVBAのソースです。

●知りたいこと。

(1)ミニロトの場合は、31個から5個全てが一致すると一等ですが、
 「25個から5個選択した場合の組み合わせ(25C5)」作成方法

(2)ロト6の場合は、43個から6個全てが一致すると一等ですが、
 「24個から6個選択した場合の組み合わせ(24C6)」作成方法。

●入力

(1)ミニロトの場合は、下記のように5×5マスに重複しない数字が入っています。
  数字は毎回変わります。
  1   2 5 6 7
10 4 11 13 15
8 9 17 21 28
14 16 18 20 25
19 22 23 24 27

(2)ロト6の場合は、下記のように6×4マスに重複しない数字が入っています。
  数字は毎回変わります。

  1   2 5 6 7 19
10 4 11 13 5 22
8 9 17 21 28 23
14 16 18 20 25 24

●出力

  VBAを実行すると、新シートにそれぞれ、25C5又は、24C6の全組み合わせが出力される。

【注意事項】
   ・使用しているエクセルは2010です。

以上、ご回答よろしくお願いします。

どなたかご存じでしたら回答願います。
ミニロトとロト6をエクセルを使用して予想に利用しております。
その中で知りたいのは、下記の場合のエクセルVBAのソースです。

●知りたいこと。

(1)ミニロトの場合は、31個から5個全てが一致すると一等ですが、
 「25個から5個選択した場合の組み合わせ(25C5)」作成方法

(2)ロト6の場合は、43個から6個全てが一致すると一等ですが、
 「24個から6個選択した場合の組み合わせ(24C6)」作成方法。

●入力

(1)ミニロトの場合は、下記のように5×5マス...続きを読む

Aベストアンサー

過去のQ&A(参考URL)を参照なさってはいかがでしょう?

参考URL:http://oshiete.goo.ne.jp/qa/5571459.html

QVBAで関数をつくる

If文やForNext構文を駆使して階乗、順列、組み合わせの計算を実現する関数を作りたいです。どのように考えてどのようなプログラムを書けばよいか教えてください!

Aベストアンサー

階乗については、
Function Fact(n) as long
Fact = 1
for i = 1 to n
Fact = Fact * i
next i
End Function
で最低限のものは実現できます。 最低限という意味は、エラーが起きたときの対応ができていないということです。
例えば、負の数を引き渡したときは、1が返されます。
また、171以上の数を引き渡すと、オーバーフローしますし、
longの定義上正確に計算できるのは、17までだと思います。

組み合わせについても、
Function Combi(n,r) as long
Combi = Fact(n)/(Fact(r)*Fact(n-r))
End Function
で最低限のものは作れますが、やはりFactの制限に引っかかります。
factというファンクションを使わなければ、
ループを使い
n(n-1)(n-2)(n-3)・・・(n-r+1)/r!
を計算することによって、多少は上限が増えますが、どの時点で正確でなくなるのか、どの時点でオーバーフローするのかなどを検証しておく必要はあります。

それよりも完成度の高いものを目指す場合は、数自体の構造体を自分で作り、それらを演算させるプログラムを組まなくてはいけません。演算する速度は遅くなりますが、VBAで作れないわけではありません。

何にしても、計算の上限値はどこかに設定しておかなくてはいけませんし、上限を越した際のエラー処理の方法を考えておく必要があります。 

階乗については、
Function Fact(n) as long
Fact = 1
for i = 1 to n
Fact = Fact * i
next i
End Function
で最低限のものは実現できます。 最低限という意味は、エラーが起きたときの対応ができていないということです。
例えば、負の数を引き渡したときは、1が返されます。
また、171以上の数を引き渡すと、オーバーフローしますし、
longの定義上正確に計算できるのは、17までだと思います。

組み合わせについても、
Function Combi(n,r) as long
Combi = Fact(n)/(Fact(r)*Fact(n-r))
End ...続きを読む

QC言語プログラミング 逆行列を求めるプログラムを教えてください。

C言語プログラミングで掃きだし法を使って与えられた行列の逆行列を求めるプログラムを作っています。行列に0が出てきた時に対応ができないので困ってます。例えば、次の行列の逆行列を求めるプログラムを教えてください。
0 2 3
1 0 1
3 3 0
よろしくお願いします!

Aベストアンサー

ピボットで検索しましょう。
掃き出しで行や列を交換してもよいのですよ。
簡単でしょ?

出来れば、計算誤差を減らすピボットの
選択方法も学ぶと良いです。


人気Q&Aランキング

おすすめ情報