计算a月的第b个星期c

计算从y1到y2年a月的第b个星期c的日期

#include<iostream>
using namespace std;
bool isLeap(int y)
{
    if(y%400==0 || y%4==0&&y%100!=0)
        return true;
    return false;
}
int main()
{
    int a,b,c;
    int y1,y2;
    int pre_ydays = 0; //
    int pre_mdays = 0;
    int week = 0;
    int b1 = 0;//用于计数,第b1个星期c
    int day = 1;//用于记录当前是是第a月的第几天
    int months[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
    cin>>a>>b>>c>>y1>>y2;
    if(c == 7)  //因为7%7 =0
        c = 0;
    for(int i=1850;i<y1;i++) //计算从1850年到y1年之前共有多少天
    {
        if(isLeap(i))
            pre_ydays += 366;
        else
            pre_ydays += 365;
    }
    week = (pre_ydays+2) % 7;//计算y1年1月1号是星期几,因为1850年1月1号是星期二,所以要加2
    for(int y = y1;y<=y2;y++)//从y1年到y2年遍历
    {
        //如果是闰年2月份是29天
        if(isLeap(y))
            months[2] = 29;
        for(int m=1;m<a;m++)
        {
            pre_mdays += months[m];//记录从y年1月1号到a月1号之前有多少天
        }
        week = (pre_mdays + week)%7;  //计算呢a月1号是星期几
        b1 = 0;//用于记录第b1个星期c,初始化为0
        day = 1;//记录到第几天了
        for(int d = 1;d<=months[a]; d++)
        {
            
            if(week == c)//是星期c
            {
                b1 ++;
            }
            if(week==c && b1==b)//是当前日期
                break;
            day++;
            week = (week+1)%7;
        }
        printf("%4d/%02d/%02d\n",y,a,day);
        //为计算下一年做准备
        pre_ydays = pre_ydays+365;
        if(isLeap(y))
        {
            pre_ydays += 1;
            months[2] = 28;
        }
        week = (pre_ydays +2)%7;
        pre_mdays = 0;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ttzz/p/10553929.html
今日推荐