Дата Пасхи
Попалась мне как-то на глаза цитата с баша (из бездны)
"Пасха рассчитывается по формуле Гаусса: a = [(19 * [Y / 19] + 15) / 30], где Y - год, [] - остаток от деления; b = [(2 * [Y / 4] + 4 * [Y / 7] + 6 * a + 6) / 7]; Если (a + b) > 10, то Пасха будет (a + b - 9) апреля ст. стиля, в противном случае — (22 + a + b) марта ст. стиля. Дата Пасхи может попадать в период от 22 марта до 25 апреля по ст. стилю (от 4 апреля до 8 мая по н. стилю)." Гаусс не только великий ученый но и священный математик =)
Я, как известно, человек не очень религиозный, но меня это заинтересовало. Тем более что паска не за горами. Алгоритм уже есть, осталось только его реализовать, а это всего пару строчек кода. Затык был только один - преход с Юлианского календаря на Григорианский. Согласно википедии переход на Григорианский календарь был произведен папой римским Григорием XIII 4 октября 1582. Но не все поддержали эту инициативу и переход длился 346 лет с 1582 по 1928 год. Вот это нихуясебе не могли договориться! Но поскольку Пасхой заведует папа то я решил что моментом перехода будет считаться 1582 год, Пасха в котором была по "старому" стилю.
Чтобы алгоритм с цифрами не смотрелся совсем одиноко я оформил небольшой апплет, который высчитывает Пасху в нашей эре, тоесть время до рождества не доступно, да и собственно не нужно, потому что Пасху тогда не отмечали. Сначала вы посмотрите код, а потом сможете посчитать когда была Пасха например в год вашего рождения.
package ua.kiev.mabp;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Date;
import java.text.SimpleDateFormat;
/**
* Created by IntelliJ IDEA.
* User: CTAPbIu_MABP
* Date: 17.04.2009
* Time: 10:15:29
*/
public class Easter extends Applet implements ActionListener {
private String date;
private TextField tf;
public void init() {
setSize(300,100);
String year = new SimpleDateFormat("yyyy").format(new Date());
date = calculate(Integer.parseInt(year));
tf = new TextField (year, 20);
add(tf);
Button btn = new Button("Calculate!");
btn.addActionListener(this);
add(btn);
}
public void paint(Graphics g) {
g.drawString(date, 40, 50);
}
public void actionPerformed(ActionEvent event) {
String year = tf.getText().replaceAll("[^\\d]","");
tf.setText(year);
date = !year.isEmpty() ? calculate(Integer.parseInt(year)) : "Enter valid year, please!";
repaint();
}
public static String calculate(int year){
int a = (19 * (year % 19) + 15) % 30;
int b = ( 2 * (year % 4) + 4 * (year % 7) + 6 * a + 6) % 7;
int oldDate = (a + b) > 9 ? (a + b - 9) : (22 + a + b);
String oldMonth = (a + b) > 9 ? " april" : " march";
int newDate;
String newMonth;
if((a + b) > 9){ // апрель
newDate = oldDate + 13 > 30 ? oldDate + 13 - 30 : oldDate + 13;
newMonth = oldDate + 13 > 30 ? " may" : " april";
}else{ // март
newDate = oldDate + 13 > 31 ? oldDate + 13 - 31 : oldDate + 13;
newMonth = oldDate + 13 > 31 ? " april" : " march";
}
return year > 1582 ? newDate + newMonth : oldDate + oldMonth;
}
}
Итак смотрите что у меня получилось в результате:
Свежие комментарии