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тыс.
Заранее спасибо. И ещё, по моему у вас сполера не работаею, или Я не так пишу
по-моему, в коде косяк
Вот я вижу фрагмент отбмена значений:
p[i]:=p[j]; p[j]:=n;
Но переменная n инициализируется вне цикла, то есть ко второй итерации она может оказаться не равной p[i]
и ещё вы меняете j внутри цикла по j, это неправильно
и используйте тэг [ code ] [ /code]
было б не плохо если вы написали текст исправленной проги
Что за алгоритм вы пытались реализовать?
Почему не используете отступы?
Ваша программа в Дельфи даже не компилируется, потому что Дельфи запрещает менять управляющие переменные цикла внутри цикла.
j:=i внутри цикла по j от m до i. Зачем это? Просто чтобы выйти из цикла преждевременно? Для этого есть слово break;
for i:=1 to m do write(a[p[i]]:4); - и это внутри цикла по i! Вы нарушаете работу цикла. Замените i на j, тогда оно хотя бы скомпилируется. Только показывать все перестановки оно, конечно же, не будет. Просто хотя бы потому, что двойным циклом не получить более n*n вариантов, а надо получить n! (факториал)
получается нужно заменить i на j. но все перестановки все равно не выдаст...Как сделать так что б выдал все перестановки.
P.S. в АВСпаскале запускается и работает
Использовать рекурсию, такой ответ вас удовлетворит?
Или алгоритм Дейкстры.
Вы ведь его попытались реализовать?