题目标题: 高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
请严格按照格式,通过浏览器提交答案。
注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。
解:
从1777年4月30日起往后加天数。按照常规想法,用三个整型(year,month,day)来保存计算后的日期,初始值为高斯的生日(1777年4月30日),把计算日期放在直接加到日期的day中,再把月份的日期保存到一个数组中方便使用,而2月份的日期要时时更新。
当日期大于对应月份的日期时,将day减去当前月份的天数,month+1;反之弹出循环
当month>12,便重新从1月开始,随即使year+1。
但是样例输入后得到的却是12月15日,由此推出,出生当天就是day1,计算时,需要将输入的数-1。
优化方案:不再一月一月的计算,而是一年年的减,之后再按月减
答案:1799-7-16
代码:
#include<iostream>
using namespace std;
int main(){
int year=1777,month=4,day=30;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int a;
cin>>a;
day+=(--a);
while(1){
//校准2月天数
if(year%400==0||(year%4==0&&year%100))
days[2]=29;
else days[2]=28;
//判断循环条件
if(day<days[month])break;
if(month>12){
month-=12;
year++;
}
day-=days[month];
month++;
}
cout<<year<<"-"<<month<<"-"<<day<<endl;
return 0;
}