- 締切済み
"n!"(階乗)の数字列の生成
ある"n"(数字)を入力すると、"n!"(階乗)通りの数字列を生成するプログラムを作りたいのですが、 どのような考え方でプログラムを作成すればよいのかわかりません。 例えば、"7"と入力すると 1,2,3,4,5,6,7 1,2,3,4,5,7,6 1,2,3,4,6,5,7 ・ ・ ・ 7,6,5,4,3,2,1 のように7!通りの数字列を出力されるようにしたいのです。 アドバイスを頂けないでしょうか。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- graphaffine
- ベストアンサー率23% (55/232)
Oiron_Uotiさん、今日は。 順列生成の基本的な考えは、n!個の順列に1からn!までの重複しない番号をつけることです。 それができたら番号を受け取って順列を返す関数を作ります。(下記参考サイトでは最小完全ハッシュ関数と呼んでいます。C言語を使っていますが、原理が載っていますので、VBに直すのもたいした手間じゃないでしょう) それを例えばSub GetPerm(Number as integer, Perm() as byte)とするとき、 for i=1 to 100 GetPerm(i,Perm); next i; のように書くと、Permに順に番号1から100までの順列が入ることになります。 ネット上で検索すると1番目の順列を元に2番目を作る、2番目を基にして3番目を作る・・・というようなやり方がほとんどですが、上で書いたやり方の大きな利点は、例えば100億個の順列がほしいとき、10億個毎に別マシンで行うというように簡単に分散化できることです。 ところで、nはどの程度の大きさを想定していますか。 通常は、12!までしか取り扱えないことはご存知ですよね。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
お礼
ありがとうございます。 C言語はわかりませんが、参考にします。
お礼
ありがとうございます。 このやり方だと、先頭が"1"の文字列のみ欲しいという場合にも対応できそうですね。
補足
nは9くらいまでを想定しています。 12!までしか扱えないということは知りませんでした。