#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()
возвращает представление десятичного числа с плавающей запятой. Это представление неточно, как вы видите из вашего вопроса. Вместо этого вам нужно придумать алгоритм для вычисления цифр самостоятельно. Я предлагаю вам разобрать целые числа из введенной дроби и выполнить деление самостоятельно.