#include<bits/stdc++.h>
#define N 1005
#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
//1850-01-01 星期二
//是否闰年
int isLeapYear(int y){
if(y % 400 == 0) return 1;
if(y % 4 == 0 && y % 100 != 0) return 1;
return 0;
}
int year[2051]; //记录每年的第一天是星期几
//计算每年的第一天是星期几
void firstDayOnYear(int y){
int m = 365;
mst(year, 0);
year[1850] = 2;
for(int i=1851; i<=y; i++){
m = 365;
if(isLeapYear(i - 1)) {
m = 366;
}
m = (m - (7 - year[i-1])) % 7;
if(m == 0) year[i] = 7;
else year[i] = m;
//cout<<i<<": "<<year[i]<<endl;
}
}
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// y年m月的第一天是星期几
int firstDayOnMonth(int y, int m){
month[2] = 28;
int sum = 0; //记录y年的前m-1个月有多少天
if(isLeapYear(y)) month[2] = 29;
for(int j=1; j<m; j++){
sum += month[j];
}
int day1;
if(sum == 0) day1 = year[y];
else if((sum - (7 - year[y])) % 7)
day1 = (sum - (7 - year[y])) % 7;
else day1 = 7;
//cout<<y<<‘ ‘<<day1<<endl;
return day1;
}
int main(){
int a, b, c, y1, y2;
cin >> a >> b >> c >> y1 >> y2;
firstDayOnYear(y2);
for(int i=y1; i<=y2; i++){
int sum = 0;
if(b>5) {
cout<<"none\n";continue;
}
int day1 = firstDayOnMonth(i, a); // i年a月的第一天是星期几
int day = c>=day1 ? (1+c-day1) : (8+c-day1); //第一个星期c
day += (b - 1) * 7;
if(day > month[a]) {
cout<<"none\n";
continue;
}
//输出 printf("%d/%02d/%02d\n", i, a, day); //输出m位数,数位不足时用x补足:%xmd
cout<<i<<"/";
if(a < 10) cout<<"0";
cout<<a<<"/";
if(day < 10) cout<<"0";
cout<<day<<endl;
}
return 0;
}
原文:https://www.cnblogs.com/monster-yher/p/13177753.html