M/n - нужно напечатать период дроби (на паскале)

Ответить
Mihij
Сообщения: 55
Зарегистрирован: 03 май 2004, 11:58
Откуда: Санкт-Петербург
Контактная информация:

22 окт 2004, 23:30

Я далал похожую прогу на С++. Могу рассказать алгоритм.
1. получаешь остаток от деления Mod.
2. Конвертируешь его в массив типа *char.
3. Выбираешь первый элемент массива и смотришь есть ли совпадения, Потом комбинация первого и второго, естественно уже с шагом 2 и так4 далее. Когда получишь несколько совпадений подряд-значит найден период. Только надо прогнать весь массив до конца а то если 0,4444144441,,, То можно получит 0,(4), а не 0,(44441).
Вообще алгоритм поиска схож с энтропией.
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

23 окт 2004, 03:15

Mihij, что-то я не совсем понял твой алгоритм, но даже если я правильно догадываюсь :), он не будет работать с большими периодами.
Предлагаю такой алгоритм. Паскаль был очень давно, код не 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";
[/size]
Mihij
Сообщения: 55
Зарегистрирован: 03 май 2004, 11:58
Откуда: Санкт-Петербург
Контактная информация:

27 окт 2004, 21:13

Возможно я и не очень понятно описал алгоритм, но он вполне рабочий. С большими периодами (>10) он будет работать. только тормозить по страшному начнем. Так что признаю, что для таких чисел твой лучше подойдет.
Ответить