高斯日记

题目描述

大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

高斯出生于:1777年4月30日。

在高斯发现的一个重要定理的日记上标注着:5343。

因此可算出那天是:1791年12月15日。

给出高斯日记上的一个数字N,

请你算出高斯写日记时的年月日。

为了方便,我们假设高斯从出生后的第一天就开始写日记了,一直写到他去世时也就是1855年2月23日。

输入

输入数据有多组,每组占一行,由1个实数组成,表示N且1<=N<=28423 

输出

对于每组输入数据,输出一行,结果同样例格式一致。

样例输入

1
28423

样例输出

1777-04-30
1855-02-23

#include<stdio.h>
int month[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int ydays[2][1]={{365},{366}};
int y=1777;
int m=4;
int d=30;

int is_lyear(int year){
    int is=0;
    if((year%4==0&&year%100!=0)||year%400==0) is=1;
    return is;
}
void cal(int mdays){
    int fy_sd=1+31+30+31+31+30+31+30+31;
    if(mdays>fy_sd){//超过1777年
            mdays-=(fy_sd+1);
            y+=1;//处理第一年
            m=1;
            d=1;
            while(mdays>ydays[is_lyear(y)][0]){//先算需要添加的年份
                mdays-=ydays[is_lyear(y)][0];
                y+=1;
            }
            while(mdays>0){
                d+=1;
            if(d>month[is_lyear(y)][m]){
                d=1;
                m+=1;

            }

                mdays--;
            }
    }
    else{
        mdays--;
        while(mdays>0){
            d+=1;
            if(d>month[is_lyear(y)][m]){
                d=1;
                m+=1;
            }
           mdays--;
        }
    }



  printf("%d-%02d-%02d\n",y,m,d);
}


int main(){

int n;
while(scanf("%d",&n)!=EOF&&n>=1&&n<=28423){
     y=1777;
     m=4;
     d=30;
    cal(n);



}
return 0;
}

 

posted @ 2020-03-13 15:44  JC97  阅读(279)  评论(0编辑  收藏  举报