タイトル : Re^4: 効率的なパンデジタル数作成方法が分かりません 投稿日 : 2017/04/19(Wed) 10:19 投稿者 : nis9036
魔界の仮面弁士様 さてやってみようかともう一度本ツリーを覗いてみたら もう返事が来ているので驚きました。 御手数掛けます。 Redim Preserve 使っています。と云うのもどれくらいの配列量になるのか分からなかったので一つ見付ける度に カウントアップして配列量を増やしてやろう。と安直に考えていました。 教えて貰った方法で最初から配列数を指定できます。 頭にゼロがくる事についてはValで数値化した時に省けば良かろう。とこれまた安易に考えていました。 後ろの桁に行くほど選択肢が狭くなる事には気が付いていましたが、幾つか試して 「こんなん リストアップの所で and <> やっとるのとかわらんやんけ」と努力を放棄していました。 再帰については ”世の中にそんな方法があるらしく、どうやら不定ループをかなり簡潔に処理できるらしい” と云う事だけ知っていました。 早速プリントアウトして試してみます。 重ね重ねありがとうございました。 > > ListBoxを使うと遅いと分かっていたので実際には配列を使っていました。 > > ReDim Preserve を使ってはいないですよね? > > > > 因みに18時間ぐらい廻していますが120万件ほど集まっていました。 > > その計算ペースですと、終了までには 2〜3 日かかりそうですね。 > PC 性能にもよりますが、先の私の方法なら 15 秒前後だと思います。 > > > >>> 下記の繰り返し処理をやってみたのですが、3桁の場合は良いのですが、 > > 1,2,3 の 3 桁に対して、N1 = 0〜2、N2 = 0〜2、N3 = 0〜2 のループを行っていますよね。 > > これはすなわち、CH の個数を x としたときに、 > 『x^x 回』のループが行われるということを意味します。 > > x = 3 ならば「27 回」のループが行われることになりますが、 > それによって求まる組み合わせは、下記の「6 通り」しか > ありませんので、かなりの回数が無駄になります。 > 123 > 132 > 213 > 231 > 312 > 312 > > > > 改めて、1,2,3 の組み合わせについて考えてみましょう。 > > 最初の数字は、1/2/3 のいずれかですよね。 > 最初の数字が 1 だった場合、次の文字は 2/3 のいずれかですよね。 > 最初が 1 で二番目が 3 だったら、次の文字は必ず 2 ですよね。 > > > このように、後ろの桁になるほど選択肢が狭まることがわかります。 > これはすなわち、組み合わせ数が『x! 通り』であるということです。 > (先の私のコードでは、Except 拡張メソッドを再帰的に呼び出すことで対処しています) > > > 計算してみると分かりますが、『x!』と『x^x』とでは、文字通り桁違いの数となります。 > > n = 2 なら「2」と「4」 > n = 3 なら「6」と「27」 > n = 4 なら「24」と「256」 > n = 5 なら「120」と「3,125」 > n = 6 なら「720」と「46,656」 > n = 7 なら「5,040」と「823,543」 > n = 8 なら「40,320」と「16,777,216」 > n = 9 なら「362,880」と「387,420,489」 > n =10 なら「3,628,800」と「10,000,000,000」 > n =11 なら「39,916,800」と「285,311,670,611」 > n =12 なら「479,001,600」と「8,916,100,448,256」 > > n =16 なら「20,922,789,888,000」と「18,446,744,073,709,551,616」 > > n =32 なら「263,130,836,933,693,530,167,218,012,160,000,000」と > 「1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976」 > > > ※パンデジタル数では、先頭の数字が 0 になることがありませんので、 > 10! = 3,628,800 通りではなく、10! - 9! = 3,265,920 通りです。 |