2013蓝桥杯B组-高斯日记

题目标题: 高斯日记

大数学家高斯有个好习惯:无论如何都要记日记。

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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;
}

猜你喜欢

转载自blog.csdn.net/qq_43508196/article/details/87997118
今日推荐