Печать всех перестановок чисел от 1 до 5 - Free Pascal
Формулировка задачи:
Программа печатает все перестановки чисел от 1 до 5.
Решение задачи: «Печать всех перестановок чисел от 1 до 5»
textual
Листинг программы
Var RS : String; Function StRevers(St :String) : String; Var ii : Longint; St0 : String; Begin St0:=''; For ii:=length(St) downto 1 do St0:=St0+St[ii]; StRevers:=St0; end; Function LexNext(S : String) : String; Var len,m,k,t : Longint; Sch : Char; cs : String; flag : Boolean; Begin len:=Length(S); flag:=True; For m:=len-1 downto 1 do If S[m]<S[m+1] then Break; For k:=len downto m+1 do If S[k]>S[m] then Begin flag:=False; Break; end; If flag then LexNext:='' else Begin For t:=len downto m+1 do If (S[t]>S[m]) and (S[t]<=S[k]) then k:=t; cs:=S; Sch:=cs[m]; cs[m]:=cs[k]; cs[k]:=Sch; LexNext:=Copy(cs,1,m)+StRevers(Copy(cs,m+1,len-m)); end; end; Begin RS:='12345'; While RS<>'' do Begin Writeln(RS); RS:=LexNext(RS); end; end.
Объяснение кода листинга программы
В этом коде используется две функции:
- Функция
StReversпринимает строкуStи возвращает её обратное представление. Эта функция инициализирует переменнуюSt0пустой строкой, а затем проходит по всем символам строкиStв обратном порядке и добавляет каждый символ вSt0. В конце функция возвращаетSt0. - Функция
LexNextпринимает строкуSи возвращает следующую перестановку символов в этой строке. Эта функция сначала определяет длину строкиlen, а затем использует два циклаforдля определения текущего порядка символов. Если текущий символ меньше следующего, функция прерывает выполнение. Если текущий символ больше следующего, функция устанавливает флагflagвfalseи прерывает выполнение. Если текущий символ больше или равен следующему, но меньше последнего символа, функция находит максимальную позицию этого символа и заменяет его на последний символ в текущей позиции. Функция возвращает пустую строку, если достигается конец строки, иначе возвращает переставленную строку. В основной части кода используется циклwhile, который продолжает выводить текущую строкуRSи вызывать функциюLexNext, покаRSне станет пустой строкой.