练习题:节假日
日历有阳历(公历)和阴历(农历)之分。每年都有法定节假日,这些分成三类——双休、阳历节假日、阴历节假日。
1.双休
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号是星期几(一周内的第几天,每周从星期一开始计数,即星期一为第一天)。
输出格式
输出一个整数,表示当年放假的天数。
样例输入
2017
1 28
4 4
5 30
10 4
7
样例输出
113
//节假日
#include<iostream>
using namespace std;
int mm[10] = { 1, 5, 10, 10, 10, 12};
int dd[10] = { 1, 1, 1, 2, 3, 25 };
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void nextday(int &m, int &d)
{
d++;
if(d == day[m]+1)
{
m++;
d = 1;
}
}
int main()
{
int y, m, d, w, sf, ans;
scanf("%d", &y);
//判断闰年
if( (y % 100 != 0 && y % 4 == 0) || y % 400 == 0)
{
day[2]++;
}
for(int i=6; i<10; i++)
{
scanf("%d %d", &mm[i], &dd[i]);//输入当年阴历节假日的阳历日期
}
scanf("%d", &w);
m = 1;
d = 1;
sf = 0;
ans = 0;
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
{
for(int i=0; i<10; i++)
{
if( m == mm[i] && d == dd[i] )
{
ans++;
break;
}
}
}
nextday(m, d);
w += 1;
if( w == 8 )
{
w = 1;
}
}
printf("%d", ans);
return 0;
}