Doing print ("repeated numbers:", t)
печатает представление самой функции t
, а не ее вывод.
Вот исправленная версия вашего кода.Я использую строку Python 3.6+ для преобразования повторяющихся цифр в строку и добавляю нули к передней части, чтобы сделать ее правильной длины.
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)
output
num: 1 den: 7 period: 6 digits: 142857
num: 1 den: 17 period: 16 digits: 0588235294117647
Эта строка может быть немного загадочной:
f"{z // d:0{k}}"
Она гласит: Найдите наибольшее целое число, меньшее или равное z
, деленное на d
, преобразуйте его встроку, и дополните ее нулями (если необходимо) слева, чтобы придать ей длину k
.
Как отмечает Гойо в комментариях, этот алгоритм не идеален.Он застревает в цикле, если десятичная дробь содержит какую-либо неповторяющуюся часть, то есть если знаменатель имеет какие-либо факторы 2 или 5. Посмотрите, можете ли вы найти способ справиться с этим.