PTA | Calendar

日历是用于表述时间的系统,从小时到分钟,从月到日,最后从年份到世纪。术语小时、日、月、年、世纪都是日历系统表述时间的单位。 按照目前国内使用的阳历,闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定公元2000年1月1日后的天数,请您计算这一天是哪年哪月哪日星期几。 # 输入格式: 输入包含若干行,每行包含一个正整数,表示2000年1月1日后的天数。输入最后一行是−1, 程序不必处理。可以假设输出的年份不会超过9999。

输出格式:

对每个测试用例,输出一行,该行给出对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek”必须是下面中的一个:“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”或“Saturday”。

输入样例:

1730
1740
1750
1751
-1

输出样例:

2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday

代码示例:

#include<stdio.h>
#include<string.h>
int isleapyear(int n){
    if(n%400==0){
        return 1;
    }
    if(n%100==0){
        return 0;
    }
    if(n%4==0){
        return 1;
    }
    return 0;
}
int main(){
    int n;
    int y,m,d;
    int days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    char day[7][10] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    scanf("%d",&n);
    int N;
    while(n!=-1){
        N=n;
        y=2000;
        m=1;
        d=0;
        n++;
        while(n>0){
            //printf("*%d\n",isleapyear(y)?days2[m]:days1[m]);
            //printf("n=%d\n",n);
            if(n<=(isleapyear(y)?days2[m]:days1[m])){
                d+=n;
                n=0;
            }
            else{
                n-=(isleapyear(y)?days2[m]:days1[m]);
                
                m++;
                if(m>12){
                    m-=12;
                    y++;
                }
            }
            
        }
        printf("%d-%02d-%02d %s\n",y,m,d,day[(N+5)%7]);
        scanf("%d",&n);
    }
    return 0;
}

PTA | Calendar
https://acm.nanyan.cc/posts/6817.html
作者
nanyan
发布于
2023年10月19日
许可协议