百练2964 日历问题

已知公元2000年1月1日是星期六,计算经过n天后的年月日和星期。

由于2000年有366天,但是第一天已经过去,所以在计算时要注意2000年还剩365天。

#include<stdio.h>
#include<string.h>
char s[7][10]={"Saturday","Sunday","Monday","Tuesday",
"Wednesday","Thursday","Friday"};

int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool isRun(int y)
{
    bool flag = false;
    if(y%400==0)
        flag = true;
    else if(y%4==0 && y%100!=0)
        flag = true;
    return flag;
}

int main()
{
    int n;
    while(scanf("%d",&n))
    {
        if(n==-1) break;
        char week[10];
        strcpy(week,s[n%7]);  //先算出星期几

        int endy,endm,endd;
        if(n<=365)
        {
            endy=2000;
        }else{
            int c = n/365; //大致过了几年
            n=n-365; //2000年已过
            int i;
            for(i=2001;i<=2000+c;i++)
            {
                int days=365;
                if(isRun(i))
                    days=366;
                if(n<=days) break; //最后处于第i年,在该年要过n天
                else n-=days;
            }
            endy = i;
        }
        int sumd = 0;
        if(isRun(endy)) month[2]=29;
        else month[2]=28;

        if(endy==2000) n=n+1;//由于2000年1月1号这天已过

        int j;
        for(j=1;j<=12;j++)
        {
            if(n<=month[j]) //最终处于第j月
                break;
            else n-=month[j];
        }
        endm = j;
        endd = n;
        printf("%d-%02d-%02d %s\n",endy,endm,endd,week);

    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/zizahn/article/details/80720370