Ovo je klasični zadatak s kalendarom za koji jedan od prihvatljivih algoritama funkcionira na principu prebrojavanja dana od nekog početnog datuma pa sve do traženog. Točnije, za svaki mjesec tražene godine provjeravamo da li se u tom mjesecu nalazi datum "petak trinaesti", brojimo koliko ima takvih mjeseci i koji je prvi od njih. PETAK.PAS --------- program petak; const ime : array [1..12] of string[8] = ( 'sijecanj','veljaca','ozujak','travanj','svibanj','lipanj', 'srpanj','kolovoz','rujan','listopad','studeni','prosinac' ); var godina,koliko_puta,mjesec : integer; function prijestup(n : integer) : boolean; begin if ((n MOD 4 = 0) AND (n MOD 100 <> 0)) OR (n MOD 400 = 0) then prijestup := true else prijestup := false; end; procedure izracunaj; const dani : array [1..11] of integer = ( 31,28,31,30,31,30,31,31,30,31,30 ); var i : integer; curr_month : integer; zbroj : longint; begin koliko_puta := 0; mjesec := 0; curr_month := 1; zbroj := 18; for i := 1600 to godina - 1 do begin inc(zbroj,365); if prijestup(i) then inc(zbroj); end; repeat if zbroj MOD 7 = 5 then begin inc(koliko_puta); if mjesec = 0 then mjesec := curr_month; end; if curr_month = 12 then break; inc(zbroj,dani[curr_month]); if (curr_month = 2) AND prijestup(godina) then inc(zbroj); inc(curr_month); until false; end; begin writeln; write('Upisite godinu : '); readln(godina); izracunaj; writeln; writeln('Broj pojavljivanja datuma "petak trinaesti" = ',koliko_puta); writeln('Mjesec u kojem se prvi put pojavljuje : ',ime[mjesec]); end. PETAK.C ------- #include char *ime[] = { "sijecanj","veljaca","ozujak","travanj","svibanj","lipanj", "srpanj","kolovoz","rujan","listopad","studeni","prosinac" }; int godina; int koliko_puta = 0,mjesec = 0; int prijestup(int n) { if ((!(n % 4) && (n % 100)) || (!(n % 400))) return 1; return 0; } void izracunaj(void) { int i; int curr_month = 1,dani[] = { 0,31,28,31,30,31,30,31,31,30,31,30 }; long zbroj = 18l; for (i = 1600;i < godina;++i) { zbroj += 365; if (prijestup(i)) ++zbroj; } do { if (zbroj % 7 == 5) { ++koliko_puta; if (!mjesec) mjesec = curr_month; } if (curr_month == 12) break; zbroj += dani[curr_month]; if (curr_month == 2 && prijestup(godina)) ++zbroj; ++curr_month; } while (1); } int main(void) { printf("\nUpisite godinu : "); scanf("%d",&godina); izracunaj(); printf("\nBroj pojavljivanja datuma \"petak trinaesti\" = %d\n",koliko_puta); printf("Mjesec u kojem se prvi put pojavljuje : %s\n",ime[mjesec - 1]); return 0; }