二,3年元旦星期三,4年元旦星期四,…即
week =(year)%7。
由于闰年的存在会在2月多一天,因此,闰年的下一年元旦星期几应再加1,即 5年为星期六(不是星期五,因为 4年是闰年),因此需要知道前year-1年中有多少个闰年。闰年的规则简述就是每4年一个闰年,每100年不是闰年,每400年又是闰年。按集合包含与容斥规则,闰年个数有 (year-1)/4 - (year-1)/100 + (year-1)/400。
因此,已知年号year,就可以根据year计算出该年元旦是星期几。计算公式如下:
week=[ year+(year-1)/4-(year-1)/100+(year-1)/400]%7;
(2)源程序。
#include <stdio.h>
int main()
{
int table[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char str[7][3]={"日","一","二","三","四","五","六"};
int year,month,day,d,i,week;
while (scanf("%d/%d/%d",&year,&month,&day)!=EOF)
{
week=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
d=0;
for (i=1;i<=month-1;i++)
d+=table[i];
if (month>2 && (year%4==0 && year%100!=0 || year%400==0))
d++;
d=d+day;
week=(week+d-1)%7;
printf("%d 年 %d 月 %d日 星期%s\n",year,month,day,str[week]);
}
return 0;
}
弄懂了本例的编程思路,可以自己做一下 HDU 2133 “What day is it”。将上面的源程序略作修改即可。
【例4】10月21日。(HDU 1491)
2006年10月21日是杭州电子科技大学50周年校庆日。输入一个2006年的日期,输出其距离校庆日还有多少天。
(1)编程思路。
2006年是非闰年,因此不需要判断闰年。10月21日是当年第294天。根据输入的日期计算该日期是2006年的第几天(设为d),然后根据d与294的大小关系,输出相应的结果。
(2)源程序。
#include <stdio.h>
int main()
{
int table[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int month,day,d,i,t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&month,&day);
d=0;
for (i=1;i<=month-1;i++)
d+=table[i];
d=d+day;
if (d<294)
printf("%d\n",294-d);
else if (d==294)
printf("It's today!!\n");
else
printf("What a pity, it has passed!\n");
}
return 0;
}
【例5】今夕何夕。 (HDU 6112)
2019 年10月1日是中华人民共和国建国70周年。这天是星期二。思考这样一个问题:接下来最近的哪一年里的同一个日子,和建国70周年的星期数一样?比如2019年10月1日,星期二。下一个也是星期二的10月1日发生在2024年。
输入一个日期yyyy-mm-dd,输出