En exécutant print ("nombres répétés :", t)
, on imprime la représentation de la fonction t
, et non sa sortie.
Voici une version corrigée de votre code. J'utilise une f-string de Python 3.6+ pour convertir les chiffres répétés en une chaîne de caractères, et j'ajoute des zéros devant pour avoir la bonne longueur.
def find_period(n, d):
z = x = n * 9
k = 1
while z % d:
z = z * 10 + x
k += 1
digits = f"{z // d:0{k}}"
return k, digits
# Test
num, den = 1, 7
period, digits = find_period(num, den)
print('num:', num, 'den:', den, 'period:', period, 'digits:', digits)
num, den = 1, 17
period, digits = find_period(num, den)
print('num:', num, 'den:', den, 'period:', period, 'digits:', digits)
sortie
num: 1 den: 7 period: 6 digits: 142857
num: 1 den: 17 period: 16 digits: 0588235294117647
Cette ligne peut sembler un peu mystérieuse :
f"{z // d:0{k}}"
Cela signifie : Trouver le plus grand entier inférieur ou égal à z
divisé par d
, le convertir en une chaîne de caractères, et le remplir de zéros à gauche (si nécessaire) pour lui donner une longueur de k
.
Comme le souligne Goyo dans les commentaires, cet algorithme n'est pas parfait. Il tourne en boucle si la décimale contient une partie non répétée, c'est-à-dire si le dénominateur contient des facteurs de 2 ou de 5. Voyez si vous pouvez trouver un moyen de gérer cela.