2013第四屆藍橋杯省賽C++A組【第一題:高斯日記】

jianjianjianjian01發表於2020-11-06

第一題

標題:高斯日記

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

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

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

輸入格式

在一行輸入一個整數n

輸出格式

輸出高斯出生n天后的日期 ,例如:1980-03-21

輸入樣例

5343

輸出樣例

1791-12-15

解析:
1.當月份是12 日期是32時年份進位再把月日歸1
2.大月在日期是32時月份進位再把日期歸1
3.小月是31時月份進位再把日期歸1
4.閏年2月在日期為30時月份進位再把日期歸1 ⑤平年2月在日期為29時月份進位再把日期歸1

#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;
} 

相關文章