Период последовательности чисел

Ответить
Zhamie
Сообщения: 1
Зарегистрирован: 22 июл 2009, 14:37

:) Добрый денек!!!
Помогите с программкой для нахождения периода псевдослучайной последовательности.
Моя программка вычитывает последовательность чисел из файла, помещает их в Memo, затем должен найти есть ли период и какова его длина. Я начала реализацию вот так:

var i,j,k:integer;
q,t:integer;
n:integer;
e:array[1..100] of integer;

begin
n:=Memo1.Lines.Count;
for i:=1 to n do
begin
e:= StrToInt(Memo1.Lines.Strings[i-1]);
end;

begin
k:=1;
for i:=1 to n do
begin
for j:=2 to n do
if e = e[j]
then
for q:=i+1 to j-1 do
begin

t:=j+1;
if (e[q] = e[t]) then
k:=k+1;
inc(t);
end
else Continue;

end;
end;

Memo2.Lines.Add('dlina perioda: '+IntToStr(k));
Memo2.Lines.Add('period: ');

for i:=1 to k do
Memo2.Lines.Add(IntToStr(e));

end;
end.

Но для последовательности (возмем простую последовательность) 1584015840 он находит правильно длина - 5 а период - 15840. А если перид повторяется >3 раз (напр., 123412341234) то появляются непонятные цифры. (ответ для этой посл. длина 4, период 1234).
dr.Jekill
Сообщения: 526
Зарегистрирован: 03 янв 2009, 23:17
Откуда: Voronezh
Контактная информация:

Мне кажется легче сделать по такому принципу:
1. Определили последовательность. Запомнили строкой. Определили длину.
2. Перевели всю исходную цепочку цифр в строку.
3. Считаем период функцией pos.

Мне кажется основное внимание стоит сконцентрировать на правильном определении последовательности.
Нет религии выше истины
TAVulator
Сообщения: 4
Зарегистрирован: 23 июл 2009, 21:40

Если задача заключается именно в этом:
Но для последовательности (возмем простую последовательность) 1584015840 он находит правильно длина - 5 а период - 15840. А если перид повторяется >3 раз (напр., 123412341234) то появляются непонятные цифры. (ответ для этой посл. длина 4, период 1234).
то вот пример на паскале:

Код: Выделить всё

const
 S: string = '123412341234';
var
 k: string;
Begin
 k:=S[1];
 delete(S,1,1);
 k:=k+copy(S,1,pos(k,S)-1);
 writeln('Dlina perioda: ',length(k));
 writeln('Period: ',k);
End.
считывать из файла не стал, т.к. думаю у вас с этим проблем нет.
Ответить