思路:直接初始化,把1850-2050每一天是星期几算出来,输入后按题意判断就行了。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int N = 6005;
typedef long long ll;
int mon[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int week[205][13][35];
void init(int n) //初始化
{
int now=2;
for(int i=1850;i<=n;i++)
{
int leap=(i%4==0 && i%100)|| i%400==0;
for(int j=1;j<=12;j++)
for(int k=1;k<=mon[leap][j];k++)
{
if(now>7) now=1;
week[i-1850][j][k]=now++;
}
}
}
int cal(int y,int m,int w,int d)
{
int leap=(y%4==0 && y%100)|| y%400==0;
int ans=1,num=1;
while(week[y-1850][m][ans]!=d)
ans++;
while(num<w) ans+=7,num++;
if(ans>mon[leap][m]) return -1;
return ans;
}
int main()
{
int a,b,c,y1,y2;
cin>>a>>b>>c>>y1>>y2;
init(y2);
for(int i=y1;i<=y2;i++)
{
int day=cal(i,a,b,c);
if(day<0)
cout<<"none"<<endl;
else
printf("%d/%02d/%02d\n",i,a,day);
}
return 0;
}