L’algorithme de Dattatreya Ramachandra Kaprekar

VOICI une petite appplication écrite en python3 (sa forme permet une autoexécution pour un système Unix) reprenant l’algorithme imaginé en 1949 par Dattatreya Ramachandra Kaprekar (1905-1986). Pour ce qui est de la théorie, voir la page de Wikipedia.

L’algorithme est plutôt simple :

Voici l’application qui permet d’éviter ces calculs qui deviennent vite fastidieux :

#! /usr/bin/python3

print("""
  Générateur des suites de Kaprekar -- Jean-Christophe Beumier -- GPL3

  Pour un nombre de trois chiffres, la différence entre le nombre
  constitué de ses trois chiffres en ordre descendant et le nombre
  constitué de ses chiffres ascendant finit (itération) par donner 495

  Exemple: 381 -> 831 -138 = 693 -> 963 -369 = 594 -> 954 -459
   = 495 -> 954 -459 =495 (ce dernier nombre cycle sur lui même)

  Des cas triviaux donnent 0 : 100 -> 100 -1 = 99 -> 99 -99 =0

  À quatre chiffres, le nombre final est 6174 (ou 0)
  Pour plus de chiffres, des cyclages sur plusieurs nombres apparaissent
""")

q =int(input("nombre de chiffres (de 2 à 5 est recommandé): "))

texte =[] ; mx =0
for i in range(10 **(q -1), 10 **q) : # détermination de la plage des nombres
  n =i ; suite =[]
  while -1 :
    ch =str(n)
    n1 =int("".join(sorted(ch)))                # mises en ordre
    n2 =int("".join(sorted(ch, reverse=True)))  # des chiffres
    n =n2 -n1 ; nn =str(n)
    # si un nombre est déjà présent dans la suite
    if nn in suite :
      fin =suite.index(nn) ; lon =len(suite)
      suite[fin] =f">{suite[fin]}"              # marquage du début de cycle
      ligne =f"{i} ({lon}) {' '.join(suite)}<"
      mx =max(lon, mx)
      break

    suite +=[nn]

  print(ligne)
  texte +=[ligne]

print("itération maximale:", mx)
open(f"kaprekar{q}ch.txt", "w").write("\n".join(texte))