Я далал похожую прогу на С++. Могу рассказать алгоритм.
1. получаешь остаток от деления Mod.
2. Конвертируешь его в массив типа *char.
3. Выбираешь первый элемент массива и смотришь есть ли совпадения, Потом комбинация первого и второго, естественно уже с шагом 2 и так4 далее. Когда получишь несколько совпадений подряд-значит найден период. Только надо прогнать весь массив до конца а то если 0,4444144441,,, То можно получит 0,(4), а не 0,(44441).
Вообще алгоритм поиска схож с энтропией.
M/n - нужно напечатать период дроби (на паскале)
Mihij, что-то я не совсем понял твой алгоритм, но даже если я правильно догадываюсь :), он не будет работать с большими периодами.
Предлагаю такой алгоритм. Паскаль был очень давно, код не Perl'е, но с комментариями, думаю, будет всё понятно.
[/size]
Предлагаю такой алгоритм. Паскаль был очень давно, код не Perl'е, но с комментариями, думаю, будет всё понятно.
Код: Выделить всё
#Исходные данные.
my $m = 1;
my $n = 1019;
#Здесь будет результат.
my $period = '';
#Вспомогательный массив. Будем отмечать, "когда и где" мы были.
#Число елементов - n. Тип int. Исходные значения 0.
my @test; $#test = $n-1;
#Находим первоначальный остаток от деления.
my $rest = $m % $n;
#Текущая позиция в результате.
my $pos = 1;
#Цикл. Выполняется пока остаток не равен 0.
while ($rest != 0) {
#Проверям, не встречался ли уже такой остаток.
#Если да, период найден, выходим из цикла.
last if ($test[$rest-1] != 0);
#Отмечаем остаток и его позицю.
$test[$rest-1] = $pos;
#Добавляем следующую цифру в результат
$rest = $rest * 10;
$period = $period . int($rest / $n);
#и определям новый остаток
$rest = $rest % $n;
#Увеличиваем счетчик позиций.
$pos++;
}
#Проверяем остаток. Если не 0, есть период
if ($rest != 0) {
#В начале результата, могут быть цифры, которые не входят в период.
#Позицию, с которой начинается период, находим в массиве.
#Возвращаем подстроку с этой позиции до конца.
$period = substr($period, $test[$rest-1]-1);
}
else {
$period = '0';
}
#Выводим результат.
print "Period: $period";
-
- Сообщения: 55
- Зарегистрирован: 03 май 2004, 11:58
- Откуда: Санкт-Петербург
- Контактная информация:
Возможно я и не очень понятно описал алгоритм, но он вполне рабочий. С большими периодами (>10) он будет работать. только тормозить по страшному начнем. Так что признаю, что для таких чисел твой лучше подойдет.