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

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

Форум «Всё о Паскале» _ Задачи _ Вывод количества перестановок

Автор: leha_fenchenco@mail.ru 15.11.2012 17:39

Program perestanowki;

const
mm=100;
var
m,i,j,k,n:integer;
a,p:array[1..mm] of integer;
begin
write('Введите число эл.для перестановки ');
readln(m);
writeln('Введите элементы массива a[1..m]');
for i:=1 to m do
begin
write('Введите ', i, '-й элемент ');
readln(a[i]);
p[i]:=i
end;
for i:=1 to m do write(a[i], ' ');
writeln;
for i:=m-1 downto 1 do
if p[i] < p[i+1] then
begin
n:=p[i];
for j:=m downto i do
if n < p[j] then
begin
p[i]:=p[j]; p[j]:=n;
k := 1;
while i+k < m-k+1 do
begin
n:=p[i+k];
p[i+k]:=p[m+1-k];
p[m+1-k]:=n;
k:=k+1
end;
j:=i
end;
for i:=1 to m do write(a[p[i]]:4);
writeln
end
end.

Как сделать так что б она сохраняла ВСЕ ответы в документ, и не тормозилась на первых 20тыс.
Заранее спасибо. И ещё, по моему у вас сполера не работаею, или Я не так пишу

Автор: TarasBer 15.11.2012 19:06

по-моему, в коде косяк
Вот я вижу фрагмент отбмена значений:
p[i]:=p[j]; p[j]:=n;
Но переменная n инициализируется вне цикла, то есть ко второй итерации она может оказаться не равной p[i]

и ещё вы меняете j внутри цикла по j, это неправильно

и используйте тэг [ code ] [ /code]

Автор: leha_fenchenco@mail.ru 15.11.2012 19:09

было б не плохо если вы написали текст исправленной проги

Автор: TarasBer 16.11.2012 15:10

Что за алгоритм вы пытались реализовать?
Почему не используете отступы?

Ваша программа в Дельфи даже не компилируется, потому что Дельфи запрещает менять управляющие переменные цикла внутри цикла.

j:=i внутри цикла по j от m до i. Зачем это? Просто чтобы выйти из цикла преждевременно? Для этого есть слово break;

for i:=1 to m do write(a[p[i]]:4); - и это внутри цикла по i! Вы нарушаете работу цикла. Замените i на j, тогда оно хотя бы скомпилируется. Только показывать все перестановки оно, конечно же, не будет. Просто хотя бы потому, что двойным циклом не получить более n*n вариантов, а надо получить n! (факториал)

Автор: leha_fenchenco@mail.ru 17.11.2012 16:23

получается нужно заменить i на j. но все перестановки все равно не выдаст...Как сделать так что б выдал все перестановки.

P.S. в АВСпаскале запускается и работает

Автор: Krjuger 17.11.2012 18:22

Использовать рекурсию, такой ответ вас удовлетворит?

Автор: TarasBer 17.11.2012 18:37

Или алгоритм Дейкстры.
Вы ведь его попытались реализовать?