Localize file www.TrSek.com/cover/mojzis/postupnost.pas{ ============== }
{ KSP 15. rocnik 115: Postupnost Copyright (c) Jan Mojzis }
{ ============== }
{ Zadanie: }
{ Zostavte program, kt. bude vo vzostupnom poradi vytvarat 100 najmensich }
{ cisel v mnozine M, ak je M definovana nasledujuco: }
{ i) cislo 1 je z M }
{ ii) ak cislo x je z M, tak aj cisla 2x +1 a 3x +1 su z M }
{ iii) ziadne ine cisla, nez tie, ktore vzniknu pomocou pravidiel i) alebo ii),}
{ nepatria do M. }
{ Na ukazku uvedieme prvych sedem prvkov mnoziny M: 1,3,4,7,9,10,13,... }
{ ----------------------------------------------------------------------------}
{ Postupnost: vzorec: }
{ predosle je na zaciatku 1 }
{ 1) cislo a = (predosle X 2) + 1 }
{ 2) cislo b = (predosle X 3) + 1 }
{ }
{ cislo a a cislo b su pridane do zoznamu, ak tam este niesu (nieje). }
{ potom je predosle. }
{ Vtip je v tom, ze je treba nasledujuce predosle updatovat. Ale ako? }
{ Jednoducho pole[index], kde index je samostatny, a posuva sa len vtedy}
{ ked su vygenerovane nove cislo a a cislo b (na konci smycky repeat).}
{ Teda predosle = pole[index]. }
{ }
{ Author: (c) 2007 Jan Mojzis }
{ Date : 06.07.2008 http://www.trsek.com }
program postupnost;
var i,p,q : integer;
generovane,generovane2 : integer;
najdene,zapisuj : boolean;
M : array[1..100] of integer;
M_i : integer;
cislo : integer;
temp : integer;
procedure zatried(var pole : array of integer); { Zatriedenie na koniec }
var p,q, pom,pom2 : integer;
begin
for p := 1 to 100 do begin
for q := 100 downto p do begin
if M[p] > M[q] then begin
pom:=M[p]; pom2:=M[q];
M[q]:=pom; M[p]:=pom2;
end;
end;
end;
end;
begin
generovane:=1; generovane2:=1;
M_i := 1;
{ kazde cislo ktore vygenerujeme, }
{ musime znovugenerovat cez obidva }
najdene :=false; { vzorce 2xCislo[index] + 1 a }
M[1]:=1; { 3xCislo[index] + 1 a az }
cislo:=1; { (pozn.autor) na zaciatku je cislo }
temp:=0; { nastavene na 1. }
repeat
zapisuj:=true;
generovane:= (2 * cislo) + 1;
generovane2:= ( 3 * cislo) + 1;
for i := 1 to 100 do { jednotku uz v poli nechceme, uz ju mame }
if (M[i] = generovane) or (M[i] = generovane2) then
zapisuj:=false;
if zapisuj then begin
inc(M_i);
if(M_i) = 100 then begin M_i:=100;
najdene:=true; M[M_i]:=generovane
end
else begin
M[M_i]:=generovane;
{ write(',',generovane); }
inc(M_i);
if(M_i) = 100 then begin
M_i:=100; najdene:=true; M[M_i]:=generovane2;
end
else begin
M[M_i]:=generovane2;
{ write(',',generovane2); }
end;
end;
end;
inc(temp);
cislo:=M[temp]; { inkrement indexu matice s }
until najdene; { generovanymi cislami, pre vyrobu }
{ novych gen. cisel }
zatried(M); { USETRIME CAS, KED TO SPRAVIME AZ NA KONCI }
write('Cisla : ',M[1]);
for i := 2 to 100 do
write(',',M[i]); { potom je index+1,... }
writeln;
writeln('..To vse, pocet cisel: ', high(M));