百练OJ:2964:日历问题
題目鏈接:
2964日歷問題
描述:在我們現(xiàn)在使用的日歷中, 閏年被定義為能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它們不是閏年。例如:1700, 1800, 1900 和 2100 不是閏年,而 1600, 2000 和 2400是閏年。 給定從公元2000年1月1日開始逝去的天數(shù),你的任務(wù)是給出這一天是哪年哪月哪日星期幾。
輸入:輸入包含若干行,每行包含一個正整數(shù),表示從2000年1月1日開始逝去的天數(shù)。輸入最后一行是?1, 不必處理。可以假設(shè)結(jié)果的年份不會超過9999。
輸出:對每個測試樣例,輸出一行,該行包含對應(yīng)的日期和星期幾。格式為“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 個月中每個月的日期數(shù)。根據(jù)題目要求,所有涉及的數(shù)值都是用整數(shù)可以表示的。這個問題可以分解成兩個彼此獨立的問題:一個是要求的那天是星期幾,另一是要求的那天是哪年哪月那天。第一個問題比較簡單,知道 2000 年 1 月 1 日是星期幾后,只要用給定的日期對 7 取模,就可以知道要求的一天是星期幾。第二個問題相對麻煩一些。我們用 year, month, date 分別表示要求的日期的年、月、日。當輸入一個整數(shù) n 時,如果 n 大于等于一年的天數(shù),就用 n 減去一年的天數(shù),直到 n 比一年的天數(shù)少(這時假設(shè)剩下天數(shù)為 m),一共減去多少年 year 就等于多少;如果 m 大于等于一個月的天數(shù),就用 m 減去一個月的天數(shù),直到 m 比一個月的天數(shù)少(這時假設(shè)剩下的天數(shù)為 k),一共減去多少個月 month 就等于多少;這時 k 為從當月開始逝去的天數(shù),k+1 就是要求的 date。這里減去一年的天數(shù)時要判斷當年是否是閏年,減去一月時要判斷當月有幾天。
解題代碼:
#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; }
總結(jié)
以上是生活随笔為你收集整理的百练OJ:2964:日历问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百练OJ:2799:浮点数格式
- 下一篇: 百联OJ:2723:不吉利日期