1. 高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。
解法一:
思路:
已知高斯出生的日期为1777-4-30,而且距离该日5343天的日期是1971-12-15.可以利用此条件来测试程序的正确性。
首先看年份,使用总天数除以365得出过了x年。然后判断在这x年中有多少个是闰年,闰年就将总天数减去366天,不是闰年就减去365天。
第二步使用剩余的天数判断是几月,使用一个表记录每个月的天数,因为高斯的生日是在4月,已经过了2月,所以不需要考虑这一年是不是闰年,
直接使用剩余的天数减每个月的天数,当剩下的天数不足30天时,就是具体的日期。不要忘记最后日期要 -1,因为4月30日是第一天,之前计算的时候并没有考虑这个1。
#include<stdio.h>
//判断闰年
int is_ryear(int y)
{
return ((y%4 == 0)&&(y%100 != 0 || y% 400 == 0));
}
int mm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y,m,d; //记录最终的年月日
int t_y = 0, t_m = 0; //记录经过的年数和月数
int n; //输入的总天数
scanf("%d",&n);
//年份
t_y = n/365;
for(int i = 1778; i <= 1777 + t_y; i++)
{
if(is_ryear(i)) n -= 366;
else n-= 365;
}
y = 1777 + t_y;
//月份
for(int i = 4; i < 12; i++)
{
if(n < 30) break;
n -= mm[i];
t_m++;
}
m = 5 + t_m;
//天数
d = n - 1;
printf("%d-%02d-%02d\n", y, m, d);
return 0;
}
解法二:
使用Excel表格计算,将日期和题目给出的天数求和 -1就是当前日期(表格属性要选日期)。