Вычислить длину периода повторяющейся десятичной дроби - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу сделать программу на Python (3.6.5), которая сообщает длину, например, 1/7. Вывод должен быть для этого примера что-то вроде: «длина: 6, повторяющиеся числа: 142857». Я получил это до сих пор:

n = int(input("numerator: "))
d = int(input("denominator: "))

def t(n, d):
    x = n * 9
    z = x
    k = 1
    while z % d:
        z = z * 10 + x
        k += 1
        print ("length:", k)
        print ("repeated numbers:", t)

    return k, z / d

t(n, d)

1 Ответ

0 голосов
/ 18 сентября 2018

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. Посмотрите, можете ли вы найти способ справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...