Помощь - Поиск - Пользователи - Календарь
Полная версия: Длина периода 1/n
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Artem7
Никак не могу придумать по которому бы определялось длина периода 1/n (n любое число)
TarasBer
Попробую угадать, что требуется.
f := 0;
while f < 1 do begin
...
f := f + 1/n;
end;
IUnknown
Похоже, требуется узнать период числа 1/n записанного в виде десятичной дроби. Скажем, для n = 7 период равен 6, ибо 0.(142857), для n = 11 - двум, ибо 0.(09), и так далее. Выкладывалось на форуме точно, Artem7, напрягай поиск.
Artem7
Поюзал ничего подобного не нашёл(((
IUnknown
Значит, неправильно использовал поиск. "+длин* +перио*" выдает всего десяток результатов (пройтись по всему десятку можно было вполне, это не сотня страниц результатов), четвертый сверху - тот, который я имел в виду: дроби
Artem7
Цитата(IUnknown @ 4.04.2012 18:05) *

Значит, неправильно использовал поиск. "+длин* +перио*" выдает всего десяток результатов (пройтись по всему десятку можно было вполне, это не сотня страниц результатов), четвертый сверху - тот, который я имел в виду: дроби

спасибо)
Artem7
А это реализовать можно как нить попроще? а то мы ещё до массивов не дошли(
IUnknown
Вот тут посмотри , никаких массивов (правда, придется чуть-чуть подкорректировать, там находится сам период, а не его длина, но как найти длину, думаю, разберешься...)
Artem7
Цитата(IUnknown @ 5.04.2012 9:59) *

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

Спасибо щас бум разбераться)))
Artem7
Что то я не совсем понял как работает твой код не мог бы ты объяснить?!
Artem7
Вот сделал так чтоб длину периода находило
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
Цитата
Что то я не совсем понял как работает твой код не мог бы ты объяснить?!
По ссылке, которую я давал там, в теме "дроби", ходил? Там есть объяснение алгоритма. И для случая 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
> Зачем приплетены строки? Зачем хранить дробь? Что, в моем коде есть где-то работа со строками, где-то хранится вещественное значение? Нет этого.

Это для универсальности. Задел на будущее.
Artem7
Да сперва что то замутил не то, а потом замутил нормально...а вещественную дробь храню чтоб было срау видно что считает правильно, мне же её сдавать надо будет)
IUnknown
Цитата
чтоб было срау видно что считает правильно
Для этого не обязательно хранить информацию, достаточно ее отобразить (выведи на печать значение m/n и всё, зачем это запоминать?). Пойми, чем меньше у тебя в программе переменных и действий с ними - тем меньше вероятность совершить ошибку.
Artem7
Цитата(IUnknown @ 5.04.2012 13:39) *

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

Учту)ещё раз спасибо)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.