题意:好长。。。给出一个时间段,问在这个时间段中,每个月第一个工作日为星期一(goodday)和最后一个工作日为星期五(luckyday)的数目各为多少。
思路:判断闰月后,不断加就好了,具体看程序。
#include<iostream>
using namespace std;
#define DAY ((day+5)%7)
int test, day, ys, ms, ye, me, good, lucky;
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
bool leap(int i){
if (i < 1582){
if (i % 4 == 0) return true;
}
else{
if (i == 1700){
return true;
}
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
return true;
}
return false;
}
int to_today(int ys, int ms){
for (int i = 1; i < ys; i++){
if (leap(i)) day+=366;
else day+= 365;
day %= 7;
}
if (ys > 1752) day = (day + 3)%7;
for (int i = 1; i < ms; i++){
day += month[i-1];
if (leap(ys) && i == 2) day+=1;
else if (ys == 1752 && i == 9) day-=11;
}
day %= 7;
return day;
}
int main(){
scanf("%d", &test);
while(test--){
day = 1;
good = lucky = 0;
scanf("%d%d%d%d",&ys,&ms,&ye,&me);
day = to_today(ys, ms) % 7;
int year = ys;
for (int i = ms; i <= 12;){
//cout << "firstDay: " <<DAY << endl;
if (DAY < 2 || DAY == 6) good++;
day += month[i-1];
if (leap(year) && i == 2) day++;
if (year == 1752 && i == 9) day -= 11;
day %= 7;
if (DAY == 6 || DAY < 2) lucky++;
//cout << "lastDay: " << DAY << endl;
if (i==me && year==ye) break;
i++;
if (i == 13){
i = 1;
year++;
}
}
printf("%d %d\n", lucky, good);
}
}