タイトル | : Re^3: 効率的なパンデジタル数作成方法が分かりません |
記事No | : 11826 |
投稿日 | : 2017/04/19(Wed) 09:55 |
投稿者 | : 魔界の仮面弁士 |
> 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 通りです。
|