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 :
- Prendre n’importe quel nombre, par exemple 486
- faire la différence entre le nombre de ses chiffres en ordre décroissant et celui en nombre croissant : 864 - 468 = 396
- répéter l’opération avec la réponse obtenue : 963 - 369 = 594 ; 954 -459 = 495
- constater qu’arrivé à 495, l’algorithme reproduit du 495 : 954 -459 = 495
- constater qu’avec certains nombres, comme 999, le résultat est nul : 999 - 999 =0
- essayer avec quelques nombres de quatre chiffres.
- essayer également avec des nombres de plus de quatre chiffres.
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))