определение периода числа при делении

#python

#python

Вопрос:

Поэтому мне нужно найти период числа при делении, например 1/7 = 0,142857142857142857… и выведите его как 0.(142857) итак, в скобках мне нужно напечатать период этого числа.

Я использую Set для этого примера

 class Set:
    def __init__(self):
        self.content= []

    def __str__(self):
        self.content.sort()
        return ''   str(self.content)

    def length(self):
        return len(self.content)

    def insert(self,x):
        if x not in self.content:
            self.content.append(x)

    def erase(self,x):
        for i in range(self.length()-1):
            if self.content[i]==x:
                del self.content[i]

    def find(self,x):
        if x in self.content:
            return True
        else:
            return False

    def items(self):
        return self.content
 

Здесь я хочу преобразовать этот ввод eval в строку, потому что я хочу найти точку при делении с помощью expression.index(‘.’) и найти этот период. После этого я помещаю этот период в ‘k’ и печатаю число до точки период этого числа.

 if __name__=='__main__':
    set1=Set()
    expression=eval(input('enter an expression: '))
    expression=str(expression)
    point=expression.index('.')
    for i in range(point 1,len(expression)):
        set1.insert(expression[i])
    k=''
    for x in set1.items():
        k =x

    print(f'{expression[:point 1]}({k})')
 

Проблема здесь в том, что, например, 7/9 = 0,7777777777778 программа выведет 0.(78) как 78 — это точка, но только 7 — это точка, а не 0,7878787878787878…

Комментарии:

1. Вы можете ознакомиться с ответами на этот раздел обмена стеками разработки программного обеспечения softwareengineering.stackexchange.com/questions/192070 / … По сути, небольшая реализация теории чисел также делает ваш результат точным и эффективным.

2. Насколько точным вы хотите, чтобы было это число? 7/9 может быть представлен как 0.78 , 0.77778 , или 0.777777777777778 . Укажите, до скольких знаков после запятой вы хотите, чтобы число было правильным.

3. @AmalK Мне нужно, чтобы этот период был в скобках, поэтому для этого примера 7 — это период чисел 7/9, и он должен быть 0.(7)

Ответ №1:

Есть несколько способов сделать это. Я использую манипуляцию со строками, чтобы выяснить, повторяется ли выражение.

  • Шаг 1: Узнайте десятичный знак в результате. Возьмите все значения после запятой для обработки
  • Шаг 2: Если нет десятичного знака, ответ no decimals
  • Шаг 3: Выполните итерацию по первой половине результирующей строки, чтобы найти шаблон
  • Шаг 3a: если левую половину можно найти в правой половине, то следите за левой половиной. Это может быть повторяющийся период.
  • Шаг 3b: Если левая половина НЕ найдена в правой половине, сдвиньте левую половину на 1 влево и найдите эту часть строки справа. Если найдено, продолжайте отслеживать, если не найдено, повторите шаг 3b
  • Шаг 4: После того, как вы выполнили итерацию по всей строке и достигли 0-й позиции, у вас будет строка наименьшего размера, которая повторяется. Это ваша строка периода
  • Шаг 5: После обработки строки от середины до 0-й позиции, если вы ничего не нашли, значит, повторяющегося периода нет. Верните ответ, основанный на том, нашли ли вы строку с повторяющимся периодом или нет

Код выглядит так, как показано ниже:

 def find_period(e):
    x = e.find('.')
    if x == -1: return 'no decimals'
    period = ''
    dec_exp = e[x 1:]
    for i in range(len(dec_exp)//2,0,-1):
        if dec_exp[i:].find(dec_exp[:i]) == 0:
            period = dec_exp[:i]
    return f'0.({period})' if period else 'no decimals'

expression = eval(input('enter an expression: '))
result     = str(expression)
print (find_period(result))
 

Выходные данные для некоторых выражений:

 enter an expression: 1/7
0.(142857)

enter an expression: 3/7
0.(428571)

enter an expression: 7/9
0.(7)

enter an expression: 3/14
no decimals

enter an expression: 22   5
no decimals

enter an expression: 8/2
no decimals

enter an expression: 6 * 2
no decimals
 

Ответ №2:

Проблема в том, что eval() возвращает представление десятичного числа с плавающей запятой. Это представление неточно, как вы видите из вашего вопроса. Вместо этого вам нужно придумать алгоритм для вычисления цифр самостоятельно. Я предлагаю вам разобрать целые числа из введенной дроби и выполнить деление самостоятельно.