应用直接存取类线性表编程:将日期存入数组中,到最后确定日期的时候直接对应数组下标取日期即可;
此题的核心思想是设计计算month和year具体有多少天的函数。
代码如下:
#include<iostream>
using namespace std;
const char wstr[][20]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};//周几字符串常量
int days_of_year(int year)//返回年的天数
{
if(year%100==0)
return year%400==0? 366:365;
return year%4==00 ? 366:365;
}
int days_of_month(int month,int year)//返回year年month月的天数
{
if(month==2)
return days_of_year(year)==366 ? 29 : 28;
int d;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
d=31;
break;
default: d=30;
}
return d;
}
int main()
{
int n;
cin>>n;
while(n>=0)
{
int year,month,day,week;
week=n%7; //这里将2000年1月1日为周六,作为一个星期的开始(因为法定周日为每周的第一天)
year=2000;
month=1;
day=1;
while(n)
{
if(n>=days_of_year(year))//枚举到指定年份
{
n-=days_of_year(year);
++year;
// cout <<year<<endl;
}
else if(n>=days_of_month(month,year))
{
n-=days_of_month(month,year);//枚举到指定月份
++month;
// cout<<month<<endl;
}
else
{
day+=n; //确定最后日期
n=0;
}
}
//按规格输出
cout<< year << '-' << (month< 10? "0": "") << month << '-' <<(day<10 ? "0":"") << day<<' '<< wstr[week] << endl;
cin>>n; //输入下一个测试用例
}
return 0;
}