日历有阳历(公历)和阴历(农历)之分。每年.
都有法定节假日,这些分成三类一双休、 阳历节
假日、阴历节假日.
1.双休
- 周六和周日2天
2.阳历节假日
1)元旦:阳历每年1月1日,放假1天.
2)劳动节:阳历每年5月1日,放假1天
3)国庆节:阳历每年10月1日,放假3天
4)圣诞节:阳历每年12月25日,放假1天
3.阴历节假日
1)春节:阴历每年1月1日,放假3天
2)清明节:阳历每年4月4-6日之间的某
天,放假1天
3)端午节:阴历每年5月5日,放假1天
4)中秋节:阴历每年8月15日,放假1天
当节假日和双休重合时,双休不延后也不提前,
保证节假日之间不会重合。现在给你某年的所有阴
历节假日的阳历日期,以及当年的1月1日是星
期几,请你计算出这一年(阳历1月1日到12月
31日)放了多少天假(包括双休、阳历节假日和阴
历节假日)。
输入格式
第一行输入年份y(1900 < y≤2050)。
接下来4行,每行输入两个整数m, d,依次表示春
节、清明节、端午节和中秋节的阳历日期。
最后一行输入个整数表示当年1月1号是星期几(一
周内的第几天,每周从星期一开始计数,即星期一
为第一天
输出放假时间即可
#include <iostream>
using namespace std;
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int nextDay(int &y,int &m,int &d){
d++;
if (d == day[m]+1){
d=1;
m++;
}
}
int main(){
int y = 0; //年份
int w = 0; //月份
int ans = 0; //总共放假天数
int sf = 0; //春节天数
int mm[10] = {1,5,10,10,10,12}; //将已知的阳历节日日期放进来
int dd[10] = {1,1,1,2,3,25};
cin >> y;
for (int i = 6; i < 10; i++) { //存后来的节日日期
cin >> mm[i] >> dd[i];
}
if ((y%100!=0&&y%4==0)||y%400==0){ //判断闰年
day[2]++;
}
cin >> w;
int m =1,d = 1;
while(m < 13){
if (m==mm[6]&&d==dd[6]){ //先判断春节,因为春节月日不确定,可能会跨月份
ans ++;
sf = 2;
}else if (sf){
ans ++;
sf --;
} else if(w==6||w==7){ //再判断周六周日,因为上面的春节不确日期和一次就要加三天,因此春节优先级最高,其次周六周日
ans ++; //一个非常重要的点,这里用的else if,也就是判断完如果是周末就不继续判断了
} else{
for (int i = 0; i < 10; i++) { //将此时的日期与今年的节日相对应
if (m==mm[i]&&d==dd[i]){
ans++;
break;
}
}
}
w++;
if (w==8){ //星期+1
w=1;
}
nextDay(y,m,d); //日+1
}
cout << ans;
}
需要特别注意的就是注释中写到的
//先判断春节,因为春节月日不确定,可能会跨月份
//再判断周六周日,因为上面的春节不确日期和一次就要加三天,因此春节优先级最高,其次周六周日
//一个非常重要的点,这里用的else if,也就是判断完如果是周末就不继续判断了