判断一年放了多少天假

日历有阳历(公历)和阴历(农历)之分。每年.
都有法定节假日,这些分成三类一双休、 阳历节
假日、阴历节假日.
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号是星期几(一
周内的第几天,每周从星期一开始计数,即星期一
为第一天

输出放假时间即可

#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,也就是判断完如果是周末就不继续判断了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值