Kaprekar Number(カプレカ数)の計算

はじめに

初めての投稿でこれはどうなのかとは思いますが(数学苦手なので)、この間はじめアルゴリズムという漫画を読んでたときにカプレカ数というのが出てきたんですよ。なんでも整数の並びを最大にしたものと最小にしたものの差を取って、この操作のあとにもとの数と等しかった数がカプレカ数というらしいです。よくわかりません。(詳しい解説はWikipediaみてください。他の定義もあるみたいですが何もわからない)

具体的な計算

例えば適当な数字1997が最大になるような並びは9971、最小になるような並びは1799ですよね。これの差を取ると
$$9971 - 1799 = 8172$$ 次に8172が最大・最小になる並びを作ってその差を取ると、
$$8721 - 1278 = 7443$$ こんな感じで計算を続けていくと、どんな4桁の数字でもある数になるらしいです、不思議

Pythonによる実装

手計算でいろんなパターンを試すのも大変だし、証明することなんてとても無理なので、Pythonにやってもらいました。

#coding: utf-8
digit = int(input("何桁?"))
calc_num = input("input number: ")

ans = 0    #一個前の値を格納する
while True:

    a = list(calc_num)    #リスト化
    a.sort()
    b = a.copy()
    b.sort(reverse=True)    #aの逆順に並べる
    #0が配列にあった時sort()では一番うしろになってしまうので0があったときにはリストから削除

    if '0' in a:
        a.remove("0")
    right = ""   #4つの数字のが最大になるような並び
    left = ""    #4つの数字が最小になるような並び
    for i in a:
        left += i
    for j in b:
        right += j
    if len(b) <= digit - 1:
        right += "0"
    calc_num = str(abs(int(left)-int(right)))
    if calc_num == ans:
        print("Kaprekar Number:", ans)
        break
    ans = calc_num

いろんな数字で実行してみたんですが、なんとびっくり全部4桁の数字では6174になってしまいました。なんでなんだろうね、だけどすごい!

まとめ

たまたま漫画で見ただけでしたが面白い数字に巡り会えました。はじめアルゴリズムも面白いのでぜひ読んでみてください

参考

はじめアルゴリズム
カプレカ数