问题描述
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210
后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。
在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113
请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21
Sample Input
5343
8113
Sample Output
1791-12-15
1799-07-16
完整代码如下
#include<stdio.h>
#include<stdlib.h>
/**普通闰年:能被4整除但不能被100整除的年份为普通闰年。
世纪闰年:能被400整除的为世纪闰年。**/
/**
闰年的2月有29天,平年的2月只有28天。
**/
bool isLeap(int y)//判断闰年
{
if(y%400!=0&&(y%4==0 && y%100!=0))
return true;
return false;
}
int main()
{
int n;
int y = 1777;
int m = 4;
int d = 30;
while(~scanf("%d",&n))
{
y=1777;
m=4;
d=30;
for(int i=2;i<=n;i++)//出生那一天是第一天,所以i从2开始
{
d++; //第二天开始,所以d要先加一
if(m==2 && ((isLeap(y)&&d==30) || (!isLeap(y)&&d==29)))//闰年2月为29天,平年2月为28天
{//闰年的2月30日等于3月1日,平年的2月29日相当于3月1日
m = 3;
d = 1;
}else if(m==12 && d==32){//12月32日相当于下一年1月1日
y++;
m=1;
d=1;
}else if(d == 32 &&(m==1||m==3||m==5||m==7||m==8||m==10))
{//对于大月下天数为32日的,均为下一个月的1日
m++;
d=1;
}else if(d == 31 &&(m==4||m==6||m==9||m==11))
{//对于小月下天数为31日的,均为下一个月的1日
m++;
d=1;
}
}
printf("%04d-%02d-%02d\n",y,m,d);//左对齐补0
}
return 0;
}
解题思路
依据题意,可得如果日记上标注 1,则为1777-04-30.因为高斯这货把他出生算为一天!
然而就本题来说其实是道填空题,在考场上不要用编程来解决,手算+excel更快些:
1777-4-30是第一天,这年过完,是第x天,
x=1+31+30+31+31+30+31+30+31=155+91=246
1778年365天
1779年365天
1780年366天
……
过完1798年共7916天,还差197天
1799年前六个月共181天,还差16天
因此答案为1799-7-16
最后一句:对于蓝桥杯省的填空题,excel是个很好的工具,特别是求和公式。