【藍橋杯】2013-A組01 高斯日記

  • 2020 年 2 月 13 日
  • 筆記

題目描述:

大數學家高斯有個好習慣:無論如何都要記日記。他的日記有個與眾不同的地方,他從不註明年月日,而是用一個整數代替,比如:4210。後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒著主人:日子又過去一天,還有多少時光可以用於浪費呢?

高斯出生於:1777年4月30日。在高斯發現的一個重要定理的日記上標註著:5343,因此可算出那天是:1791年12月15日。

高斯獲得博士學位的那天日記上標著:8113。請你算出高斯獲得博士學位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21。

解題思路:

水題,注意考慮年份、月份的進位就行了。①當月份是12 日期是32時年份進位再把月日歸1。②大月在日期是32時月份進位再把日期歸1。③小月是31時月份進位再把日期歸1。④閏年2月在日期為30時月份進位再把日期歸1。⑤平年2月在日期為29時月份進位再把日期歸1。

AC程式碼:

#include <bits/stdc++.h>  using namespace std;    bool isLeapYear(int y)  {      return (y%4==0 && y%100!=0) || (y%400 == 0);  }    int main()  {      ios::sync_with_stdio(false);      cin.tie(0),cout.tie(0);      int y = 1777,m = 4,d = 30;      int n;      cin >> n;      while(--n)      {          d++;          if(m==12 && d==32)   //過年啦~          {              y++;              m = 1;              d = 1;              continue;          }          if((m==1 || m==3 || m==5 || m==7 || m==8 || m==10) && d==32)    //大月進入下一個月          {              m++;              d = 1;              continue;          }          if((m==4 || m==6 || m==9 || m==11) && d==31)    //小月進入下一個月          {              m++;              d = 1;              continue;          }          if(m==2 && isLeapYear(y) && d==30)   //閏年2月進入下一月          {              m++;              d = 1;              continue;          }          if(m==2 && !isLeapYear(y) && d==29)   //平年2月進入下一月          {              m++;              d = 1;              continue;          }      }      cout << y << "-" << m << "-" << d << endl;      return 0;  }