Feladat: Pontversenyen kívüli P.303 Korcsoport: 16-17 Nehézségi fok: -
Megoldó(k):  Hajnal Péter ,  Sali Attila 
Füzet: 1979/január, 23 - 24. oldal  PDF  |  MathML 
Témakör(ök): Részhalmazok, Algoritmikus eljárások, Kettes alapú számrendszer, Pontversenyen kívüli probléma
Hivatkozás(ok):Feladatok: 1978/május: Pontversenyen kívüli P.303

A szöveg csak Firefox böngészőben jelenik meg helyesen. Használja a fenti PDF file-ra mutató link-et a letöltésre.

A megoldás alapötlete az, hogy egy n elemű halmaz részhalmazait n hosszúságú 0-1 sorozattal jelölhetjük ki: ha az i-edik helyen 1 áll, a halmaz i-edik eleme a részhalmazhoz tartozik, ha 0, akkor nem.
Az összes n hosszúságú 0-1 sorozatot legkönnyebben úgy állíthatjuk elő, ha a 0-tól 2n-1-ig terjedő számok kettes számrendszerbeli alakját vesszük. Egy, már meglevő sorozatból a következőt úgy kapjuk, hogy hozzá kettes számrendszerben 1-et adunk: a sorozat végén álló egyesek helyett (ha vannak ilyenek) nullát írunk és jobbról az első nulla helyett egyest.
A kiíratásnál leszámoljuk, hányadik helyen állnak egyesek (a számozást 0-val kezdjük); a sorszámokat összegyűjtjük, majd egy-egy részhalmazt egyszerre nyomtatunk.
A program FORTRAN nyelven íródott. A K tömbben képezzük a 01 sorozatokat, K(1)-ben lesz a legkisebb helyiértékű jegy, K(10)-ben pedig a legnagyobb. A kiíratásnál kihasználjuk, hogy a FORMAT lista kidolgozása abbamarad, ha elfogytak a nyomtatandó számok.

 
MASTER RESZ  DIMENSION K(10),KI(10)DO 1 l=1,10  1K(I)=0  2DO 3 I=1,10IF(K(I).EQ.0) GO TO 4  3K(I)=0STOP  4K(I)=1L=0DO 5 I=1,10I F(K(I). EQ.0) GO TO 5L=L+1KI(L)=I-1  5CONTINUEWRITE(3,6) (KI(I),I=1,L)  6FORMAT(20X,10I1)GO TO 2END