描述为了简便计算天文学家们使用儒略日Julian day来表达时间。所谓儒略日其定义为从公元前4713年1月1日正午12点到此后某一时刻间所经过的天数不满一天者用小数表达。若利用这一天文学历法则每一个时刻都将被均匀的映射到数轴上从而得以很方便的计算它们的差值。现在给定一个不含小数部分的儒略日请你帮忙计算出该儒略日一定是某一天的中午12点所对应的公历日期。我们现行的公历为格里高利历Gregorian
#include
// 判断某年是否为闰年 bool isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return true; } return false; }
// 根据儒略日计算公历日期 void calculateDate(int julianDay, int& year, int& month, int& day) { // 公元前4713年1月1日为第0天 int days = julianDay - 0;
// 先计算年份
year = 4713 - 1; // 公元前1年
while (days >= 365) {
if (isLeapYear(year)) {
if (days >= 366) {
days -= 366;
year--;
} else {
break;
}
} else {
days -= 365;
year--;
}
}
// 再计算月份和日期
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[1] = 29;
}
month = 0;
while (days >= daysInMonth[month]) {
days -= daysInMonth[month];
month++;
}
day = days + 1; // 日期从1开始计数
}
int main() { int Q; cin >> Q;
vector<int> julianDays(Q);
for (int i = 0; i < Q; i++) {
cin >> julianDays[i];
}
for (int i = 0; i < Q; i++) {
int year, month, day;
calculateDate(julianDays[i], year, month, day);
cout << day << " " << month << " ";
if (year > 0) {
cout << year;
} else {
cout << -year << " BC";
}
cout << endl;
}
return 0;
原文地址: http://www.cveoy.top/t/topic/iPeD 著作权归作者所有。请勿转载和采集!