Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Алгоритмы _ Длина периода 1/n

Автор: Artem7 4.04.2012 18:46

Никак не могу придумать по которому бы определялось длина периода 1/n (n любое число)

Автор: TarasBer 4.04.2012 19:06

Попробую угадать, что требуется.

f := 0;
while f < 1 do begin
...
f := f + 1/n;
end;

Автор: IUnknown 4.04.2012 21:01

Похоже, требуется узнать период числа 1/n записанного в виде десятичной дроби. Скажем, для n = 7 период равен 6, ибо 0.(142857), для n = 11 - двум, ибо 0.(09), и так далее. Выкладывалось на форуме точно, Artem7, напрягай поиск.

Автор: Artem7 4.04.2012 21:37

Поюзал ничего подобного не нашёл(((

Автор: IUnknown 4.04.2012 22:05

Значит, неправильно использовал поиск. "+длин* +перио*" выдает всего десяток результатов (пройтись по всему десятку можно было вполне, это не сотня страниц результатов), четвертый сверху - тот, который я имел в виду: http://forum.pascal.net.ru/index.php?s=&showtopic=16168&view=findpost&p=94717

Автор: Artem7 4.04.2012 22:30

Цитата(IUnknown @ 4.04.2012 18:05) *

Значит, неправильно использовал поиск. "+длин* +перио*" выдает всего десяток результатов (пройтись по всему десятку можно было вполне, это не сотня страниц результатов), четвертый сверху - тот, который я имел в виду: http://forum.pascal.net.ru/index.php?s=&showtopic=16168&view=findpost&p=94717

спасибо)

Автор: Artem7 5.04.2012 9:03

А это реализовать можно как нить попроще? а то мы ещё до массивов не дошли(

Автор: IUnknown 5.04.2012 13:59

http://forum.sources.ru/index.php?showtopic=157247&view=findpost&p=1305441 , никаких массивов (правда, придется чуть-чуть подкорректировать, там находится сам период, а не его длина, но как найти длину, думаю, разберешься...)

Автор: Artem7 5.04.2012 14:41

Цитата(IUnknown @ 5.04.2012 9:59) *

http://forum.sources.ru/index.php?showtopic=157247&view=findpost&p=1305441 , никаких массивов (правда, придется чуть-чуть подкорректировать, там находится сам период, а не его длина, но как найти длину, думаю, разберешься...)

Спасибо щас бум разбераться)))

Автор: Artem7 5.04.2012 15:07

Что то я не совсем понял как работает твой код не мог бы ты объяснить?!

Автор: Artem7 5.04.2012 17:00

Вот сделал так чтоб длину периода находило

Program dlina_perioda;
var
m,n,i,j,k,k1,p,dlina:integer;
drob:real;
begin
write('Введите n ');readln(n);
m:= 1;p:=10;j:=0;drob:=m/n;dlina:=0;
writeln(drob:2:10);
write('Длина периода= ');
k := 1;
while(k <= n) or (j <> m) do begin
if k = n then j := m;
i := p*m div n;
m := p*m mod n;
if k >= n then dlina:=dlina+1;
k:=k+1;
end;
Write(dlina);
readln;
end.

Автор: IUnknown 5.04.2012 17:22

Цитата
Что то я не совсем понял как работает твой код не мог бы ты объяснить?!
По ссылке, которую я давал там, в теме "дроби", ходил? Там есть объяснение алгоритма. И для случая M=1 тоже

Цитата
Вот сделал так чтоб длину периода находило
Зачем приплетены строки? Зачем хранить дробь? Что, в моем коде есть где-то работа со строками, где-то хранится вещественное значение? Нет этого. И тебе не надо:

const
p = 10;
m = 1;
var
n, i, j, k: integer;
len : integer;
begin
len := 0;
n := 7; { <--- или Readln(n); }
write(m, '/', n, ' длина периода :');

k := 1;
while(k <= n) or (j <> m) do
begin

if k = n then j := m;
i := p*m div n;
m := p*m mod n;
if k >= n then inc(len);
inc(k);

end;
writeln(len);
end.
И не надо отказываться от констант. Переменные ни разу не лучше.

Автор: TarasBer 5.04.2012 17:27

> Зачем приплетены строки? Зачем хранить дробь? Что, в моем коде есть где-то работа со строками, где-то хранится вещественное значение? Нет этого.

Это для универсальности. Задел на будущее.

Автор: Artem7 5.04.2012 17:36

Да сперва что то замутил не то, а потом замутил нормально...а вещественную дробь храню чтоб было срау видно что считает правильно, мне же её сдавать надо будет)

Автор: IUnknown 5.04.2012 17:39

Цитата
чтоб было срау видно что считает правильно
Для этого не обязательно хранить информацию, достаточно ее отобразить (выведи на печать значение m/n и всё, зачем это запоминать?). Пойми, чем меньше у тебя в программе переменных и действий с ними - тем меньше вероятность совершить ошибку.

Автор: Artem7 5.04.2012 18:55

Цитата(IUnknown @ 5.04.2012 13:39) *

Для этого не обязательно хранить информацию, достаточно ее отобразить (выведи на печать значение m/n и всё, зачем это запоминать?). Пойми, чем меньше у тебя в программе переменных и действий с ними - тем меньше вероятность совершить ошибку.

Учту)ещё раз спасибо)