高斯日期

高斯日期

  • 问题描述
    • Sample Input
    • Sample Output
    • 完整代码如下
    • 解题思路

问题描述

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

他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如: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
#include
/**普通闰年:能被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是个很好的工具,特别是求和公式。

你可能感兴趣的:(刷题OJ)