母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入:
年份
输出:
日期(5月的哪一天)
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路:
我们此前已经做过一个根据日期求星期的程序,其本质是使用一个while循环,从1900年1月1日(星期一)循环到输入的日期,算出经历了多少天,再对7取模并加1。
母亲节是5月第二个星期日,其与5月1日最多差14天,所以其最迟,也不能迟于5月14日。因此我们其实可以算出5月14日是星期几:要是星期日,当天为母亲节;要是星期n(n为1到6的整数),那就往前回溯n天后是母亲节。
#include <stdio.h>
int main(){
int year=1900,month=1,date=1,days=0,key;
int year1;
scanf("%d",&year1);
while(year!=year1 || month!=5 || date!=14){
++days;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (date == 31)
{
date = 1;
if (month == 12)
{
month = 1;
year++;
}
else
{
month++;
}
}
else
{
date++;
}
break;
case 4:
case 6:
case 9:
case 11:
if (date == 30)
{
date = 1;
month++;
}
else
{
date++;
}
break;
case 2:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
key = 29;
}
else
{
key = 28;
}
if (date == key)
{
date = 1;
month++;
}
else
{
date++;
}
break;
}
}
int week=days%7;
if(week+1==7)
{
printf("14\n");
}
else
{
printf("%d\n",14-week-1);
}
}