2019年蓝桥杯练习4-高斯的日记
每周一题之4
本周题目是蓝桥杯第四届省赛AB组第一题(填空题),请评论的同学除了给出答案,还要给出你的思路,特别是如果在竞赛中你会怎么做?
[问题描述]
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
这里的代码仅供参考,注意一下日期推算中的一下细节和思路:
//每周一练/4
#include<stdio.h>
bool isLeapYear(int year) { //判断是否是闰年
if(year%4==0 && year%100!=0) //是闰年
return true;
else if(year%400==0) //是闰年
return true;
else //不是闰年
return false;
}
int main ()
{
int year=1777+8113/365; //年份肯定是这个了,year=1799
int num=0;
for(int i=1777;i<year;i++) { //计算从1777年4月30日到1799年4月30日间隔的天数,(没有算上1777.4.30这一天 )
num=num+365; //从一年的4月30日到下一年的4月30日间隔365天
if(isLeapYear(i)) { //如果当前年是闰年就加1天
num++;
}
}
//根据示例,推出需要算上1777年4月30日这一天,所以num要加1
num++;
//num=8036
int month=4+(8113-num)/30+1; //月份。到1799.4.30为止还差8113-num=77天,两个月不够,+1到下个月
int m=0;
for(int j=5;j<month;j++) { //因为前面已经计算到了4.30,所以从5月开始 ,计算从4.30到6.30之间的天数 ,不包括4.30这一天
m=m+30;
if(j==5 || j==7 || j==8 || j==10 || j==12) {
m++;
}
}
int day=(8113-num)-m; //天数。到6.30为止还差8113-num-m=16天,day=16
printf("%d-%d-%d",year,month,day);
return 0;
}
分析:一图让你搞懂日期的推算:
也可以借助Excel分析: