|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Boris Sivko 2:452/26.14 11 Mar 2003 00:57:40 To : Andrew Starsh Subject : Ладно. --------------------------------------------------------------------------------
Отвечать на письмо на тему "Re: Ладно." очень просто. Это уже сделал Andrew
Starsh. о вот когда часы пробили ровно 06:54, а календарь показывал Воскресенье
Март 09 2003, настала моя очередь:
AS> Так и видятся два цикла, котоpыми я выкpутился. :-)
Ты не выкрутился, а решил совершенно другую задачу.
Твой код:
ДДД Цитирую golded.pas ДДД
VAR
m: array[1..256] of byte;
n,Count,count2: BYTE;
s,s1: string;
F: text;
BEGIN
for n:=1 to 4 do m[n]:=n;
Assign(F, 'com.txt');
Rewrite(F);
(*Сначала опpеделяем pазмеp массива*)
n:=0;
while m[n+1]>0 do n:=n+1;
(*Потом внешний цикл, ведущий по пpойденной части массивa*)
s:='';
count:=0;
while count<n do
begin
(*Внутpенний цикл с добавкой числа к пpойденной части*)
for count2:=count+1 to n do
begin
str(m[count2],s1);
if s='' then writeln(F,s1) else Writeln(F,s+', '+s1);
end;
count:=count+1;
str(m[count],s1);
if s='' then s:=s1 else s:=s+', '+s1;
end;
close(f);
END. ДДД Конец цитаты ДДД
Для 4-х твой результат:
ДДД Цитирую com.txt ДДД
1
2
3
4
1, 2
1, 3
1, 4
1, 2, 3
1, 2, 4
1, 2, 3, 4
ДДД Конец цитаты ДДД
Тебе не кажется, что тут сочетаний не хватает? 7 штук если быть точным.
Решение с помощью рекурсии:
ДДД Цитирую golded2.pas ДДД
Var s:string;
a:array[1..100] of byte;
i,count:longint;
t:text;
Const n_elem=4;
Procedure output(s:string);
Var i,p:longint;
Begin
inc(count);
write(t,'a[',count,']=(');
p:=length(s);
while (s[p]='0')and(p>0) do dec(p);
if p>0 then
begin
for i:=1 to p-1 do if s[i]='1' then write(t,a[i],',');
write(t,a[p]);
end;
writeln(t,')');
End;
Procedure rec(s:string);
Begin
if length(s)+1=n_elem then
begin
output(s+'0');
output(s+'1');
end else
begin
rec(s+'1');
rec(s+'0');
end;
End;
BEGIN
assign(t,'output.txt');
rewrite(t);
for i:=1 to n_elem do a[i]:=i;
count:=0;
rec('');
close(t);
END.
ДДД Конец цитаты ДДД
Её результат:
ДДД Цитирую output.txt ДДД
a[1]=(1,2,3)
a[2]=(1,2,3,4)
a[3]=(1,2)
a[4]=(1,2,4)
a[5]=(1,3)
a[6]=(1,3,4)
a[7]=(1)
a[8]=(1,4)
a[9]=(2,3)
a[10]=(2,3,4)
a[11]=(2)
a[12]=(2,4)
a[13]=(3)
a[14]=(3,4)
a[15]=()
a[16]=(4)
ДДД Конец цитаты ДДД
Рекурсивный порядок вполне очевиден.
Тебе нужен другой?
Более простой алг с классическим двоичным порядком:
ДДД Цитирую gold3.pas ДДД
var a:array[1..100] of byte;
i,j,x:longint;
const n=4;
begin
for i:=1 to 4 do a[i]:=i;
for i:=0 to round(exp(2*ln(n)))-1 do
begin
x:=i;
write('a[',i,']=(');
j:=1;
while x<>0 do
begin
if x mod 2 = 1 then write(a[j],' ');
inc(j);
x:=x div 2;
end;
writeln(')');
end;
end. ДДД Конец цитаты ДДД
Счастливо, Andrew. Вспоминай обо мне...
... I'll be back...
* Origin: Я такой же осёл, как и Вы, сэр! (2:452/26.14)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/207123e6d271b.html, оценка из 5, голосов 10
|