КАК БЕЗ РЕКУРСИИ ВЫВЕСТИ НА ЭКРАН ВСЕ ПОДСТАНОВКИ ИЗ N ЭЛЕМЕНТО В ПОРЯДКЕ УБЫВАНИЯ ЧИСЛА?? пРИМЕР ВХОД ДАННЫХ 3 вЫХОД: 321 312 231 213 132 123
volvo
30.11.2005 19:22
K Y S K A
Цитата(Правила форума)
6. Стиль сообщений
НЕ ПИШИТЕ В БОЛЬШОМ РЕГИСТРЕ! ЭТО РАСЦЕНИВАЕТСЯ КАК КРИК!! ВАМ НРАВИТЬСЯ КОГДА НА ВАС КРИЧАТ ?
K Y S K A
30.11.2005 19:23
иЗВИНИТЕ ПОЖАЛУЙСТА!!
K Y S K A
30.11.2005 19:24
Ой кэпс лук был включен, извините пожалуйста...
volvo
30.11.2005 19:39
K Y S K A, тебе нужно в порядке убывания... А что, генерировать в порядке возрастания, запоминать в массиве, а потом распечатать массив от конца к началу, никак нельзя догадаться ?
K Y S K A
30.11.2005 19:44
Ну я не совсем понимаю как без рекурсии генерировать!! Подскажите пожалуйста...
volvo
30.11.2005 19:46
Program perms; var i,j,h,n,k:integer; a:array[0..100] of integer; { массив для хранения перестановки }
{процедура вывода полученной перестановки} procedure output; var i:integer; begin writeln; for i:=1 to n do write(a[i],' '); end;
begin readln(n); { ввод кол-ва элементов перестановки } fillchar(a,sizeof(a),0); { инициализация массива }
{ ввод элементов начальной перестановки } for i:=1 to n do a[i]:=i;
repeat output; { ввод текущей перестановки } i:=n; while a[i-1]>a[i] do dec(i); { поиск скачка } j:=i-1; h:=a[j]; while a[i+1]>h do inc(i); { поиск первого меньшего элемента } a[j]:=a[i]; a[i]:=h; i:=j+1; k:=n; while i<k do begin { перестановка “хвоста” } h:=a[i]; a[i]:=a[k]; a[k]:=h; inc(i); dec(k) end until j=0; end.
И никакой рекурсии...
K Y S K A
30.11.2005 19:57
Спасибо огромное, VOLVO, ты меня спас. Чмок в щечку!
K Y S K A
30.11.2005 20:58
Извини volvo? а как в обратном порядке?? а то я попробывала и он у меня что-то не то пишет
K Y S K A
30.11.2005 22:33
Помогите кто-нить, а то завтра сдать надо!!
volvo
30.11.2005 22:39
Ну, я же сказал, как... Не распечатывать сразу, а сохранять в массив, а потом напечатать в обратном порядке...
Какое максимальное N у тебя может быть?
K Y S K A
30.11.2005 22:41
до 6 , по крайней мере препод так обещал!!
volvo
30.11.2005 22:59
Даже при N = 7 будет работать ...
Program perms; const max_n = 7; fact = 5040;
type every = array[0 .. succ(max_n)] of byte; res_type = array[1 .. fact] of every;
var i,j,h,n,k:integer; a: every; res: res_type; count: integer;
procedure output(a: every); var i:integer; begin writeln; for i:=1 to n do write(a[i],' '); end;
begin readln(n); fillchar(a,sizeof(a),0);
for i:=1 to n do a[i]:=i;
count := 0; repeat inc(count); res[count] := a; i:=n; while a[i-1]>a[i] do dec(i); j:=i-1; h:=a[j]; while a[i+1]>h do inc(i); a[j]:=a[i]; a[i]:=h; i:=j+1; k:=n; while i<k do begin h:=a[i]; a[i]:=a[k]; a[k]:=h; inc(i); dec(k) end until j=0;
for i := count downto 1 do output(res[i]); end.
K Y S K A
30.11.2005 23:05
Спасибо!! СПАСИБО!!
K Y S K A
30.11.2005 23:28
А мне ттут пришла в голову идея, а нельзя ли сделать та, что вводишь N и K и она тебе выводит все последовательности из "Н" элементов, каждый элемент последовательности принадлежит подмножеству натуральных чисел от 1 до К?? Интересно можно ли эту программку как-то исправить чтобы она работала так??
volvo
30.11.2005 23:35
Цитата
Интересно можно ли эту программку как-то исправить чтобы она работала так?
Интересно, а зачем что-то исправлять? Есть же стандартный алгоритм "Сочетания из N по M":
Program sochets; var i,j,n,m: integer; a:array[0..100] of integer;
Procedure use; var i : integer; begin writeln; for i:=1 to m do write(a[i]:3) end;
Begin read(n, m); for i:=0 to m do a[i]:=i; repeat use; i:=m; while a[i]=n-m+i do dec(i); inc(a[i]); for j:=i+1 to m do a[j]:=a[j-1]+1; until i=0; end.
Только не говори, что тебе подмножества тоже нужны
K Y S K A
1.12.2005 20:02
э... не я имела ввиду с числами типа 111111 121112 131141212113125345142354213723421734157342 то есть с повторениями! поетому и спрашивала!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.