%
% Ispis heksadekadnog faktorijela
%

pj2006092(N):-integer(N),ispisi_zaglavlje,ispisi_tablicu(1,[1],N).

ispisi_zaglavlje:-write('!   N   ! Faktorijel\n').

ispisi_tablicu(I,F,N):-I=<N,write('! '),ispisi(I,5),write(' ! '),ispisi_hex(F),nl,
                       I1 is I+1,pomnozi(I1,F,F1),!,ispisi_tablicu(I1,F1,N),!.
ispisi_tablicu(_,_,_).

ispisi(_,0):-!.
ispisi(0,D):-write(' '),D1 is D-1, ispisi(0,D1).
ispisi(Br,D):-C is Br mod 10,Br1 is Br // 10,D1 is D-1,ispisi(Br1,D1),write(C).

ispisi_hex([]):-write('0x'),!.
ispisi_hex([C|T]):-hex_cifra(C,H),ispisi_hex(T),write(H).

hex_cifra(0,0).
hex_cifra(1,1).
hex_cifra(2,2).
hex_cifra(3,3).
hex_cifra(4,4).
hex_cifra(5,5).
hex_cifra(6,6).
hex_cifra(7,7).
hex_cifra(8,8).
hex_cifra(9,9).
hex_cifra(10,'A').
hex_cifra(11,'B').
hex_cifra(12,'C').
hex_cifra(13,'D').
hex_cifra(14,'E').
hex_cifra(15,'F').

saberi(A, B, R):- saberi(A,B,0,R).
saberi([],R,0,R):-!.
saberi([],[],P,[P]):-!.
saberi([],[H|T],P,[C|R]):-C is (H+P) mod 16,P1 is (H+P)//16,saberi([],T,P1,R),!.
saberi(R,[],0,R):-!.
saberi([H|T],[],P,[C|R]):-C is (H+P) mod 16,P1 is (H+P)//16,saberi(T,[],P1,R),!.
saberi([H1|T1],[H2|T2],P,[C|R]):-C is (H1+H2+P) mod 16,P1 is (H1+H2+P)//16,saberi(T1, T2,P1,R).

pomnozi(_,[],[]).
pomnozi(I,[H|T],R):-Br is H*I,u_hex(Br,H1),pomnozi(I,T,R1),na_pocetak(0,R1,R2),saberi(H1,R2,R).

u_hex(0,[]).
u_hex(X,[C|R]):-C is X mod 16,X1 is X//16,u_hex(X1,R).

na_pocetak(X,L,[X|L]).

