Осуществил, наконец, давнюю задумку: составил программу расчета даты Пасхи в любом году. Определяются даты Православной (Orthodox), католической (Catholic) и еврейской (Jewish) Пасхи.
Очень это оказалось непростым делом: алгоритмов выложено много, но далеко не все правильные, многие с ошибками, а с учетом того, что создатели сайтов имеют обыкновение бездумно друг у друга копировать, то, сами понимаете... Ну вроде отладил. Если кому интересно, прошу протестировать и, буде ошибки вылезут, о том сообщить.
Ниже выложен исходник на Паскале и экзешник для DOS-моды. Если бы кто из Дельфийцев сделал из этого путный исполняемый файл под Windows, было бы совсем хорошо. Но это так, если есть желание.
Код:
Var
Y,a,b,c,d,e,f,g,h,i,k,L,m,n,p,A1,M1,Date:LongInt;
Month:String;
Ksi,m2:Real;
Begin
Write('Year = ');
Readln(Y);
Writeln;
a:=(19*(Y mod 19)+15) mod 30;
b:=(2*(Y mod 4)+4*(Y mod 7)+6*a+6) mod 7;
If (a+b)>=10 then
begin
If a+b-9+13<31 then
begin
Month:='April';
Date:=a+b-9+13;
end
else
begin
Month:='May';
Date:=a+b-9+13-30;
end;
end
else
begin
Month:='April';
Date:=22+a+b+13-31;
end;
Writeln('Orthodox:');
Writeln(Date:2,' of '+Month);
Writeln;
a:=Y mod 19;
b:=Y div 100;
c:=Y mod 100;
d:=b div 4;
e:=b mod 4;
f:=(b+8) div 25;
g:=(b-f+1) div 3;
h:=(19*a+b-d-g+15) mod 30;
i:=c div 4;
k:=c mod 4;
L:=(32+2*e+2*i-h-k) mod 7;
m:=(a+11*h+22*L) div 451;
n:=(h+L-7*m+114) div 31;
p:=(h+L-7*m+114) mod 31;
If n=3 then Month:='March' else Month:='April';
Date:=p+1;
Writeln('Catholic:');
Writeln(Date:2,' of '+Month);
Writeln;
A1:=Y+3760;
a:=(12*A1+17) mod 19;
b:=A1 mod 4;
Ksi:=32.0440933+1.5542418*a+0.25*b-0.00317779*A1;
M1:=Trunc(Ksi);
m2:=Ksi-1.0*M1;
c:=(M1+3*A1+5*b+5) mod 7;
If (c=1) and (a>b) and (m2>=0.63287037) then
Date:=M1+1
else
If (c=2) or (c=4) or (c=6) or
((c=0) and (a>11) and (m2>=0.89772376)) then
Date:=M1+1
else Date:=M1;
Inc(Date,13);
If Date>31 then
begin
Month:='April';
Dec(Date,31);
end else Month:='March';
Writeln('Jewish:');
Writeln(Date:2,' of '+Month);
Readln;
End.