题目大意:
给出一个非负整数n。从1900年1月1日到1900+n-1年12月31日的这段时间里,某年某月13日可能为星期一至星期日的任何一种情况,求出星期一到星期日在规定时间内符合上述条件的数量,并输出。
思路:
简单模拟,思路见注释。
代码:
/*
ID: lujunda
PROG: friday
LANG: C++
*/
#include
#include
#include
using namespace std;
//total_days[i]表示到从1900年1月1日到1900+i年1月1日所需要的天数;week[i%7]表示星期i的数量;
int total_days[401],week[7];
//若leap[i]==true,则该1900+i年为闰年;
//若month[i]==true,则第i月为大月;
bool leap[401],month[13]={true,true,false,true,false,true,false,true,true,false,true,false,true};
//判断公历n年是否为闰年。若是闰年,返回true,否则返回false;
bool check_leap(int n)
{
if((n%100&&n%4==0)||(n%400==0))
return true;
return false;
}
//初始化total_days,和leap数组;
void restore()
{
int sum=0;
for(int i=0;i<=400;i++)
{
leap[i]=check_leap(i+1900)?true:false;
if(i)
sum+=leap[i-1]?366:365;
total_days[i]=sum;
}
}
//计算第1900+n年1月1日到12月31日之间的星期一到星期日的数量,并将结果对应加到week数组上。
void cal(int n)
{
int sum=total_days[n];
//遍历12个月
for(int i=1;i>n)
{
memset(week,0,sizeof(week));
//遍历每一年
for(int i=0;i<n;i++)
cal(i);
for(int i=0;i<7;i++)
{
if(i)
cout<<" ";
cout<<week[(i+6)%7];
}
cout<<endl;
}
}