链接:https://www.nowcoder.com/questionTerminal/d95d98a2f96e49078cd7df84ba0c9d79
和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下:
- 1月1日:元旦
- 1月的第三个星期一:马丁·路德·金纪念日
- 2月的第三个星期一:总统节
- 5月的最后一个星期一:阵亡将士纪念日
- 7月4日:美国国庆
- 9月的第一个星期一:劳动节
- 11月的第四个星期四:感恩节
- 12月25日:圣诞节
现在给出一个年份,请你帮忙生成当年节日的日期。
输入描述:
输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。
输出描述:
对应每一组数据,以“YYYY-MM-DD”格式输出当年所有的节日日期,每个日期占一行。
每组数据之后输出一个空行作为分隔。
#include "iostream"
using namespace std;
int WeekToDay(int y,int m,int c,int w,bool B)
{
//输入哪年哪月第几个星期几,以及正数还是倒数,输出几号
int d,week,i;
if(1==m || m==2)
{
m+=12;
y--;
}
i = 0;
for(d = B?1:31; d <= B?31:1; B?(d++):(d--))
{
//B:正数/倒数
week =(d + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;//基姆拉尔森公式
if(week+1 == w) ++i;
if(i == c) break;
}
return d;
}
int main(void)
{
int y;
while(cin>>y)
{
cout<<y<<"-01-01"<<endl;
printf("%d-01-%02d\n",y,WeekToDay(y,1,3,1,1));
printf("%d-02-%02d\n",y,WeekToDay(y,2,3,1,1));
printf("%d-05-%02d\n",y,WeekToDay(y,5,1,1,0));//倒数
cout<<y<<"-07-04"<<endl;
printf("%d-09-%02d\n",y,WeekToDay(y,9,1,1,1));
printf("%d-11-%02d\n",y,WeekToDay(y,11,4,4,1));
cout<<y<<"-12-25"<<endl<<endl;
}
return 0;
}