【藍橋杯】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; }