高斯日记
题目描述
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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; }