【问题描述】
在我们现在使用的日历中, 闰年被定义为能被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" and "Saturday“。
【样例输入】
1730 1740 1750 1751 -1
【样例输出】
2004-09-26 Sunday 2004-10-06 Wednesday 2004-10-16 Saturday 2004-10-17 Sunday
说明:两种大情况需要分类进行处理,各个月的天数也要考虑在内,还有控制格式的要求
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
//日历问题
int n;
while(cin>>n&&n!=-1) { //输入给定的天数
int year=2000,month=0,day=0;
int s=(n+1)/365;//进行大致的估算
int y=(n+1)%365;
int run=0;
for(int i=2000; i<2000+s; i++) {
if(i%4==0&&i%100!=0)
run++;
if(i%100==0&&i%400==0)
run++;
}
if(run<y) { //修补中的第一种情况
y-=run;
year+=s;
cout<<year<<'-';
if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0)) {
day+=y;//闰年的情况
if(day<=31) {
month++;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
}
if(day>31&&day<=60) {
month+=2;
day-=31;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>60&&day<=91) {
month+=3;
day-=60;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>91&&day<=121) {
month+=4;
day-=91;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>121&&day<=152) {
month+=5;
day-=121;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>152&&day<=182) {
month+=6;
day-=152;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>182&&day<=213) {
month+=7;
day-=182;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>213&&day<=244) {
month+=8;
day-=213;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>244&&day<=274) {
month+=9;
day-=244;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>274&&day<=305) {
month+=10;
day-=274;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>305&&day<=335) {
month+=11;
day-=305;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>335&&day<=366) {
month+=12;
day-=335;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
} else { //平年的情况
day+=y;
if(day<=31) {
month++;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
}
if(day>31&&day<=59) {
month+=2;
day-=31;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>59&&day<=90) {
month+=3;
day-=59;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>90&&day<=120) {
month+=4;
day-=90;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>120&&day<=151) {
month+=5;
day-=120;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>151&&day<=181) {
month+=6;
day-=151;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>181&&day<=212) {
month+=7;
day-=181;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>212&&day<=243) {
month+=8;
day-=212;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>243&&day<=273) {
month+=9;
day-=243;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>273&&day<=304) {
month+=10;
day-=273;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>304&&day<=334) {
month+=11;
day-=304;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>334&&day<=365) {
month+=12;
day-=334;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
}
} else { //修补中更加复杂的一种情况
s--;
year+=s;
int temp=2000+s;
if((temp%4==0&&temp%100!=0)||temp%400==0)
run--;
y=n+1-365*s-run;
cout<<year<<'-';
if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0)) {
day+=y;//闰年的情况
if(day<=31) {
month++;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
}
if(day>31&&day<=60) {
month+=2;
day-=31;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>60&&day<=91) {
month+=3;
day-=60;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>91&&day<=121) {
month+=4;
day-=91;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>121&&day<=152) {
month+=5;
day-=121;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>152&&day<=182) {
month+=6;
day-=152;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>182&&day<=213) {
month+=7;
day-=182;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>213&&day<=244) {
month+=8;
day-=213;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>244&&day<=274) {
month+=9;
day-=244;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>274&&day<=305) {
month+=10;
day-=274;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>305&&day<=335) {
month+=11;
day-=305;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>335&&day<=366) {
month+=12;
day-=335;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
} else { //平年的情况
day+=y;
if(day<=31) {
month++;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
}
if(day>31&&day<=59) {
month+=2;
day-=31;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>59&&day<=90) {
month+=3;
day-=59;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>90&&day<=120) {
month+=4;
day-=90;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>120&&day<=151) {
month+=5;
day-=120;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>151&&day<=181) {
month+=6;
day-=151;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>181&&day<=212) {
month+=7;
day-=181;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>212&&day<=243) {
month+=8;
day-=212;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>243&&day<=273) {
month+=9;
day-=243;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>273&&day<=304) {
month+=10;
day-=273;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>304&&day<=334) {
month+=11;
day-=304;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
if(day>334&&day<=365) {
month+=12;
day-=334;
cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
}
}
}
if(n%7==6) cout<<"Friday"<<endl;
if(n%7==0) cout<<"Saturday"<<endl;
if(n%7==1) cout<<"Sunday"<<endl;
if(n%7==2) cout<<"Monday"<<endl;
if(n%7==3) cout<<"Tuesday"<<endl;
if(n%7==4) cout<<"Wednesday"<<endl;
if(n%7==5) cout<<"Thursday"<<endl;
}
return 0;
}