Перейти до основного контенту

Як знайти період у дробу в мові Python

9 хв читання
2477 переглядів

Періодичний десятковий знак - це десятковий знак, в якому одна або кілька цифр повторюються нескінченну кількість разів. Знаходження періоду є важливим завданням, особливо при роботі з математичними обчисленнями або аналізі даних. У мові Python є кілька способів знайти період у дробу.

Один із способів - це використання алгоритму Флойда-Тортойза. Цей алгоритм полягає в тому, щоб імітувати рух черепахи і зайця по числовій осі. Ідея полягає в тому, щоб рухатися по дробу, збільшуючи Індекс кожного елемента і порівнюючи поточний елемент з попереднім. Якщо елементи рівні, то ми знайшли період. Якщо ми дійшли до кінця послідовності і не знайшли період, значить, дріб є ірраціональною і не має періоду.

Інший спосіб-це використання вбудованих функцій мови Python. Функції `такі як` from _fractions import Fraction', дозволяють знайти періодичну дріб і отримати її у вигляді звичайного або десяткового дробу. Однак, ці функції можуть бути неефективними при роботі з великими періодами або великими числами.

Незалежно від обраного способу, знаходження періоду у дробу вимагає уваги і акуратності. Важливо перевірити результати і переконатися, що алгоритм працює коректно. Python надає зручні інструменти для роботи з періодичними дробами, які можуть бути корисними при вирішенні різних математичних задач.

Визначення періоду дробу в Python

Періодом десяткового дробу називається послідовність цифр, яка повторюється нескінченно після коми. Наприклад, в десяткового запису числа 1/3, дріб 0.333. має період 3, який повторюється нескінченно.

У Python існує кілька способів визначити період у дробу. Одним з них є використання алгоритму Флойда. Алгоритм Флойда заснований на принципі "черепахи і зайця", де черепаха і заєць представляють дві різні швидкості обходу послідовності. Якщо в послідовності є період, то рано чи пізно швидкості черепахи і зайця зрівняються і у них буде одна позиція спостереження.

Для реалізації алгоритму Флойда в Python можна використовувати цикл while і два покажчика, які будуть рухатися по послідовності. Нижче наведено приклад коду:

def find_period(numerator, denominator):numerator %= denominatorif numerator == 0:return 0turtle = numeratorhare = numeratorperiod = 0while True:turtle = (turtle * 10) % denominatorhare = (hare * 10) % denominatorhare = (hare * 10) % denominatorperiod += 1if turtle == hare:return period

Наведена функція find_period приймає чисельник і знаменник дробу як Аргументи і повертає період цього дробу. Наприклад, для дробу 1/3 виклик функції find_period (1, 3) поверне значення 1, оскільки період дорівнює 3.

Використання алгоритму Флойда допомагає ефективно знаходити період у дробах, що може бути корисно при роботі з числами великої точності і при аналізі повторюваних послідовностей в математиці.

Що таке період?

Наприклад, в десяткового дробу 1/3 періодом буде послідовність "3", так як після коми буде повторюватися нескінченно: 0.3333333.

Період можна записати за допомогою знака повторення, зазвичай розташованого над останній цифрою періоду, наприклад: 0.3333

Математичний символ періоду називається "Цифрова риса" і позначається як над цифрою.

Алгоритм пошуку періоду

Для пошуку періоду у дробу в Python можна використовувати наступний алгоритм:

1. Перевести дріб в рядок.

2. Знайти позицію десяткової коми в рядку і зберегти її в змінну.

3. Виділити цифри після коми і зберегти їх в окремий рядок.

4. Створити цикл, який буде перебирати всі можливі довжини періоду.

5. Для кожної довжини періоду створити підрядок з цифр після коми потрібної довжини.

6. Перевірити, чи повторюється дана підрядок попереду рядка. Якщо так, то знайдений період, завершити цикл і повернути результат.

7. Якщо період не знайдений після перебору всіх можливих довжин, то дріб є нескінченною і не має періоду.

Приклад реалізації алгоритму:

def find_period(fraction):fraction_str = str(fraction)decimal_position = fraction_str.find('.')digits = fraction_str[decimal_position + 1:]for period_length in range(1, len(digits) // 2 + 1):period = digits[:period_length]repeating_pattern = digits[period_length:period_length + period_length]if repeating_pattern == period:return periodreturn Nonefraction = 1/3period = find_period(fraction)print(f"The period of is ")

В даному прикладі функція find_period () приймає в якості аргументу дріб у вигляді чисельника і знаменника і повертає знайдений період. У випадку, якщо період не знайдено, функція повертає None .

Приклад коду для визначення періоду

Для визначення періоду десяткового дробу в Python можна скористатися наступним кодом:

def find_period(numerator, denominator):remainder = numerator % denominatorremainders = []while remainder not in remainders:remainders.append(remainder)remainder *= 10remainder %= denominatorperiod_start_index = remainders.index(remainder)period_length = len(remainders) - period_start_indexreturn period_lengthnumerator = 1denominator = 7period_length = find_period(numerator, denominator)print(f"The period of / is digits.")

Для визначення періоду, ми використовуємо алгоритм ділення в стовпчик. Ми зберігаємо залишки від ділення і множимо їх на 10 при кожній ітерації, щоб отримати черговий розряд десяткового дробу. Якщо черговий залишок збігається з одним з попередніх залишків, значить, ми знайшли період.

У наведеному прикладі коду, ми визначаємо період для дробу 1/7. Ми знаходимо період довжиною 6 цифр.

Оцінка складності алгоритму

Існує кілька видів оцінки складності алгоритму:

  • Тимчасова складність
  • Просторова складність

Часова складність алгоритму дозволяє визначити, скільки часу займе виконання алгоритму в залежності від розміру вхідних даних. Вона зазвичай вимірюється в термінах кількості операцій або числа ітерацій, які повинні бути виконані.

Просторова складність алгоритму дозволяє визначити, скільки додаткової пам'яті буде потрібно для виконання алгоритму в залежності від розміру вхідних даних. Вона зазвичай вимірюється в термінах кількості використовуваних змінних або розміру додаткових структур даних.

Знання складності алгоритму допомагає програмісту прийняти рішення про вибір найбільш ефективного алгоритму в конкретній ситуації. Це дозволяє оптимізувати продуктивність програмного коду і поліпшити користувальницький досвід.