题目:高斯日记(4分)
大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于1777年4月30日,在高斯发现的一个重要定理的日记上标注着5343,因此可算出那天是1791年12月15日。高斯获得博士学位的那天日记上标着8113,请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd,例如:1980-03-21
解题思路:先将初始日期提至1778年1月1日,不断加上365(闰年加366),直到不能再加,得到年份;不断加上相应月份的天数,直到不能再加,得到月份,此时得到 year-month-01, 因为1777/4/30算作8113天的第一天,(用5343,1791-12-15的数据验证),所以剩下的天数就是day
#include<iostream>
#include<cstdio>
using namespace std;
int day = 246, limit = 8113; //day初始化为246,此次日期为1978/01/01
int month_day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int is_leap(int nowYear){ //闰年判断
if((nowYear%4==0 && nowYear%100!=0) || nowYear%100==0){
return 1;
}
return 0;
}
int GetYear(int nowYear){ //返回年份
if(day+365+is_leap(nowYear) > limit){
return nowYear;
}else{
day += 365+is_leap(nowYear);
GetYear(nowYear+1);
}
}
int GetMonth(int nowYear){ //返回月份
month_day[2] = 28+is_leap(nowYear);
for(int i=1; i<13; ++i){
day += month_day[i];
if(day > limit){
day -= month_day[i];
return i;
}
}
}
int main()
{
int year = GetYear(1778); //此时日期为 year/01/01
int month = GetMonth(year); //此时日期为 year/month/01
printf("%d-%02d-%02d", year, month, limit-day); //若算1777/04/30以后的8113天,limit-day还要加 +1,不过1777/04/30按题意也算做8113天中的一天
return 0;
}