以前、カプレカ数を計算しました。

カプレカ数を計算してみる

ネタ元の動画。最大から最小を引いて元通り

カプレカ数は桁を並び替えて最大にしたものから最小にしたものを引くと元の値に等しくなる数です。前回の方法は実際にひとつずつ桁を並び替えて最大値と最小値を求めて計算しました。桁を並び替えて最大値から最小値をひくと9の倍数になるという性格を利用しても時間がかかりました。

しかし! ここにヒントがあります。

C#で開き直り数を計算する

重複組み合わせをつかって時間短縮

時間がかかっていたのは無駄な処理をしていたからでした。123も231も321も桁を並び替えて最大値から最小値を引いたときの値は同じです。にもかかわらず全部を処理していたわけですから時間もかかるでしょう。

そこで今回は、0~9までの重複組み合わせを作成してさきに両者の差を求めてしまいます。そしてその値を並べ替えて最大にしたものが最初の最大値と同じならカプレカ数とみて間違いないということになります。

では、さっそくやってみましょう。

まずn桁の0~9までの重複組み合わせを取得するメソッドを作成します。

最初に0~9までの整数が入ったリストを用意します。そして左に0~9までの整数を付加していきます。このときに付加する値は左の値よりも小さなもの以外の整数にします。これで重複組み合わせの完成です。

次に数字のリストを入れ替えることで最大にしたり最小にするメソッドを作成します。

あとは最大値から最小値を引いて得られた値を並べ変えて最大値と一致するかどうか確認します。

ではやってみましょう。

実行結果

1桁のカプレカ数
なし

2桁のカプレカ数
なし

3桁のカプレカ数
495

4桁のカプレカ数
6,174

5桁のカプレカ数
なし

6桁のカプレカ数
549,945
631,764

7桁のカプレカ数
なし

8桁のカプレカ数
63,317,664
97,508,421

9桁のカプレカ数
554,999,445
864,197,532

10桁のカプレカ数
6,333,176,664
9,753,086,421
9,975,084,201

11桁のカプレカ数
86,431,976,532

12桁のカプレカ数
555,499,994,445
633,331,766,664
975,330,866,421
997,530,864,201
999,750,842,001

12桁だけずいぶんたくさんありますね。では13桁はもっとあるのかと思って調べてみると・・・

13桁のカプレカ数
8,643,319,766,532

1個だけでした。