カプレカ数

Wikipedia を見るとカプレカ数には定義1と定義2の2つの定義があります。

カプレカ数(カプレカすう、Kaprekar Number)とは、次のいずれかで定義される整数である。
  1. 2乗して前の部分と後ろの部分に分けて和を取ったとき、元の値に等しくなるもの
  2. 桁を並べ替えて最大にしたものから最小にしたものの差を取ったとき、元の値に等しくなるもの

ここでは、定義1のカプレカ数を求めています。
例えば、
297 * 297 = 88209 = 88 + 209 = 297
となるので、297はカプレカ数ということになります。

なお、この定義1にも2つのバージョンがあるらしく、その定義が微妙に異なっています。
その定義は、Wikipediaのページのここ(日本語)ここ(英語)を見てください。

困ったことに、日本語のWikipediaのページに記載されている定義通りにカプレカ数を求めると、
同じページからリンクされている「オンライン整数列大辞典の数列A006886」に載っている具体的なカプレカ数と一部一致しません。たぶん、A053816 へリンクするところを、A006886 にリンクが貼られているようです。
そこで、このプログラムは、英語のWikipediaの定義(base == 10 の時のカプレカ数)を採用しています。

ところで、あの 巡回数である 142857 もカプレカ数なんですね。面白いですね。
巡回数 : http://gushwell.ldblog.jp/archives/51949651.html



※ 参照したWebページでは1もカプレカ数のひとつとして挙げられていますが、ここでは、1は除いています。

以下、ソースコードの簡単な説明です。

KaprekarNumber クラスが、カプレカ数を求めるクラスです。
CheckKaprekarメソッドが、引数で与えられた数がカプレカ数かどうかを判断します。
このメソッドでは、与えられた数を2乗して、文字列にします。この文字列を2つに分割した数の和が元の数になるかどうかを調べています。
戻り値は、KaprekarValue型で、元の数と分割した数を保持しています。
このCheckKaprekarメソッドを、minからmaxまで引数として渡して呼び出すことで、カプレカ数を求めています。

以下、C#+Silverlightのコードです。KaprekaNumber.csは、Silverlightに依存していません。

■KaprekarNumber.cs

■MainPage.xaml.cs

■MainPage.xaml