7-11 h0264. 日历2
分数 10
作者 黄正鹏
单位 贵州工程应用技术学院
现在使用的日历是从古罗马时期演变来的。Julius Caesar编纂了日历系统,后来被称为Julius历。在这个日历系统中,4月、6月、9月和11月有30天;非闰年的2月有28天,闰年的2月则有29天;其他月份有31天。此外,在这个日历系统中,闰年是每4年1次。这是因为古罗马的天文学家计算出1年有365.25天,因此在每4年之后,需要添加额外的一天以保持季节的正常。为此,每4年要在一年中增加额外的一天(2月29日)。
Julian规则:如果年份是4的倍数,则该年是闰年,即有额外的一天(2月29日)。
在1582年,罗马教皇Gregory的天文学家们注意到,该年不是365.25天,而是接近365.2425天。因此,闰年的规则被修订。
Gregorian历(公历)规则:年份是4的倍数是闰年,但如果这一年是100而不是400的倍数,则不是闰年。
为了弥补在那个时候已经造成的季节与日历的差异,日历被挪后了10天:在第二天,1582年10月4日被宣布为10月15日。
大英帝国(当然,那时还包括美国)当时没有改用公历,一直到1752年,才将9月2日被宣布为9月14日。(延迟改变的原因是亨利八世和教皇的关系恶劣。)
请您编写一个程序,对美国使用日历的日期进行转换,并输出是星期几。
输入格式:
输入是一个大于零的正整数序列,每行3个代表日期的整数,一个日期一行。日期的格式是“月 日 年”,其中月是1至12的正整数(1表示1月,12表示12月,等等),日是一个1至31的正整数,而年则是一个正整数。
输出格式:
输出按照样例输出中给出的格式给出输入的日期和星期几。在美国使用的日历中无效的日期或不存在的日期则要输出一个指出无效日期错误消息。输入以三个0结束。
输入样例:
11 15 1997
0 0 0
输出样例:
November 15, 1997 is a Saturday
#include <stdio.h>
int main() {
int month, day, year;
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char *months[] = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
while (1) {
scanf("%d %d %d", &month, &day, &year);
if (month == 0 && day == 0 && year == 0) {
break;
}
// Check for invalid dates
if (month < 1 || month > 12 || day < 1 || day > days_in_month[month - 1] ||
(day == 29 && month == 2 && (year % 4 != 0 || (year % 100 == 0 && year % 400 != 0)))) {
printf("Invalid date\n");
} else {
// Calculate day of the week
int total_days = 0;
for (int i = 1; i < year; i++) {
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) {
total_days += 366;
} else {
total_days += 365;
}
}
for (int i = 1; i < month; i++) {
total_days += days_in_month[i - 1];
if (i == 2 && (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) {
total_days++;
}
}
total_days += day - 1;
printf("%s %d, %d is a %s\n", months[month - 1], day, year, days[total_days % 7]);
}
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: