Все ленты — последние статьи

Перевод в периодическую дробь.

Задача:
Как найти результат деления двух чисел, а если есть период в десятичной дроби, то заключить его в скобки? Бесконечная десятичная дробь называется периодической, если ее последовательность цифр после запятой, начиная с некоторого места, представляет собой периодически повторяющуюся группу цифр. Период дроби принято заключать в скобки.
К примеру:

1/3 = 0.3333333.... = 0.(3)
111/13 = 8.5384615384… = 8.(538461)
251/6 = 41.83333333… = 41.8(3)

 

Найти результат деления, а если есть период, то заключить его в скобки.

Решение:
Данная функция находит частное двух чисел, а если есть период в дроби, то заключает его в скобки. Надеюсь, что мой код кому-нибудь понадобится, не считая меня.
Алгоритм работы функции:

В функцию поступают числовые значения: числитель (делимое) — $numerator и знаменатель (делитель) — $denominator.
Создается вспомогательный массив $array, в который будут записываться результаты деления.
Затем находим остаток от деления $numerator на $denominator — это $modulo.
Задаем счетчик $counter на 1. Образовываем цикл, который будет работать до тех пор, пока остаток $modulo будет равен нулю.
Заносим в массив значение счетчика. Остаток умножаем на 10, т.е. как при делении добавляем ноль.
При помощи функции explode извлекаем то, что находится до точки. И опять находим остаток — $modulo%=$denominator.
Добавляем еденицу счетчику. Цикл будет прокручиваться до тех пор, пока не начнет повторяться остаток. Если остаток повторяется, то цикл обрывается.
Затем стоит вспомогательное условие. Если найден модуль, то отображается часть при делении до точки и обработанный период в скобках после точки. Иначе, если периода нет, то просто отображаем результат деления.

Листинг № 1 — Перевод из десятичной дроби в периодическую дробь. Функция.
<?php
function period($numerator,$denominator){
$array=array();
$modulo=$numerator%$denominator;
$counter=1;
while($modulo!=0){
if($array[$modulo-1]!=0)break;
$array[$modulo-1]=$counter;
$modulo*=10;
$explode=explode('.',$modulo/$denominator);
$period.=$explode[0];
$modulo%=$denominator;
$counter++;
}
if($modulo!=0){
$part=explode('.',$numerator/$denominator);
return $part[0].'.'.substr($period,0,$array[$modulo-1]-1).'('.substr($period,$array[$modulo-1]-1).')';
}
else return $numerator/$denominator;
}
echo period(3870,36).'<br>';
echo period(397,259).'<br>';
echo period(183498,36).'<br>';
echo period(333,496);
?>
Результат работы функции:
107.5
1.(532818)
5097.1(6)
0.6713(709677419354838)