tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: 効率的なパンデジタル数作成方法が分かりません
投稿日: 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 通りです。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。