1. 程式人生 > >百練OJ:2964:日曆問題

百練OJ:2964:日曆問題

題目連結:

描述:在我們現在使用的日曆中, 閏年被定義為能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它們不是閏年。例如:1700, 1800, 1900 和 2100 不是閏年,而 1600, 2000 和 2400是閏年。 給定從公元2000年1月1日開始逝去的天數,你的任務是給出這一天是哪年哪月哪日星期幾。
輸入:輸入包含若干行,每行包含一個正整數,表示從2000年1月1日開始逝去的天數。輸入最後一行是−1, 不必處理。可以假設結果的年份不會超過9999。
輸出:對每個測試樣例,輸出一行,該行包含對應的日期和星期幾。格式為“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必須是下面中的一個: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 或 "Saturday“。
樣例輸入
    1730
    1740
    1750
    1751
    -1
樣例輸出
    2004-09-26 Sunday
    2004-10-06 Wednesday
    2004-10-16 Saturday
    2004-10-17 Sunday
提示:2000.1.1. 是星期六

解題思路:

這道題目使用的背景知識是閏年的定義和公曆日曆中一年 12 個月中每個月的日期數。根據題目要求,所有涉及的數值都是用整數可以表示的。這個問題可以分解成兩個彼此獨立的問題:一個是要求的那天是星期幾,另一是要求的那天是哪年哪月那天。第一個問題比較簡單,知道 2000 年 1 月 1 日是星期幾後,只要用給定的日期對 7 取模,就可以知道要求的一天是星期幾。第二個問題相對麻煩一些。我們用 year, month, date 分別表示要求的日期的年、月、日。當輸入一個整數 n 時,如果 n 大於等於一年的天數,就用 n 減去一年的天數,直到 n 比一年的天數少(這時假設剩下天數為 m),一共減去多少年 year 就等於多少;如果 m 大於等於一個月的天數,就用 m 減去一個月的天數,直到 m 比一個月的天數少(這時假設剩下的天數為 k),一共減去多少個月 month 就等於多少;這時 k 為從當月開始逝去的天數,k+1 就是要求的 date。這裡減去一年的天數時要判斷當年是否是閏年,減去一月時要判斷當月有幾天。

解題程式碼:

#include <iostream>
#include <string>
using namespace std;
int getDayOfcurrentYear(int i);
int ifrunnian(int year);
int main()
{
    string  weeks[7]={"Saturday","Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday"};
    int months1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int months2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    while(1){

    int n;cin>>n;
    if(n==-1)break;
    int week=n%7;
    int year=2000,month=1;

    while(n>=getDayOfcurrentYear(ifrunnian(year))){
        n=n-getDayOfcurrentYear(ifrunnian(year));
        year++;
    }
    if(ifrunnian(year)==1){
        while(n>=months2[month]){
            n=n-months2[month];
            month++;
        }
    }
    else{
        while(n>=months1[month]){
            n=n-months1[month];
            month++;
        }
    }
    int day=n+1;
    if(month<10){
        if(day<10){
            cout<<year<<"-0"<<month<<"-0"<<day<<" "<<weeks[week]<<endl;
        }
        else{
            cout<<year<<"-0"<<month<<"-"<<day<<" "<<weeks[week]<<endl;
        }
    }
    else{
        if(day<10){
            cout<<year<<"-"<<month<<"-0"<<day<<" "<<weeks[week]<<endl;
        }
        else{
            cout<<year<<"-"<<month<<"-"<<day<<" "<<weeks[week]<<endl;
        }
    }

    }
    return 0;

}
int ifrunnian(int year){
    bool b=true;
    if(year%4!=0){
        b=false;
    }
    else{
        if(year%100==0 && year%400!=0){
            b=false;
        }
    }
    if(b){
        return 1;
    }
    else{
        return 0;
    }
}

int getDayOfcurrentYear(int i){
    if(i==1)return 366;
    else return 365;
}