POJ 3393 Lucky and Good Months by Gregorian Calendar
这是一个讨厌的英文阅读题+讨厌的模拟题。
这真是个锻炼英语阅读和代码实现能力的好题啊!!!
题目大意是这样的:
大致题意:
科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识。
定义:
Good month : 该月第一个工作日为星期一的月份
Luckly month: 该月最后一个工作日为星期五的月份
问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)
【开始年、月】~【结束年、月】
在这个时间区间内,有多少个Goog month,有多少个Luckly month
文章要点:
Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC
GC的起始日期为 1年1月1号,该日为星期六
GC平年有365天,闰年366天(2月多1天)
GC有12个月,各月的天数和现在的使用的西历一致
GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年
GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):
(1) 能被4整除,但不能被100整除;
(2) 能被400整除。
由于历史原因,GC规定1700年无条件为闰年
由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天
GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日
(感谢大神翻译总结)
下面是代码:
#include <stdio.h> int month[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int lmonth[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31}; int leap(int year) { if(year<1582) { if(year%4) { return 0; } else { return 1; } } else { if(year==1700) { return 1; } if((!(year%4)&&(year%100)) || !(year%400)) { return 1; } } return 0; } int Sum_day(int y,int m) { int i,j,day=1; for(i=1; i<y; i++) { if(leap(i)) { day+=366; } else { day+=365; } } for(j=1; j<m; j++) { if(leap(i)) { day+=lmonth[j]; } else { day+=month[j]; } } if(y>1752) { day-=11; } else if(y==1752 && m>9) { day-=11; } return day; } int main() { int w; scanf("%d",&w); while(w--) { int ys,ms,ye,me,suml=0,sumg=0,day,i,j,flat; scanf("%d%d%d%d",&ys,&ms,&ye,&me); day=Sum_day(ys,ms); if(day%7>0&&day%7<4) { sumg++; } for(i=ys; i<ye; i++) { flat=0; if(leap(i)) { flat=1; } if(i==ys) { j=ms; } else { j=1; } if(flat) { for(; j<=12; j++) { day+=lmonth[j]; if(i==1752&&j==9) { day-=11; } if(day%7>0&&day%7<4) { suml++; sumg++; } } } else { for(; j<=12; j++) { day+=month[j]; if(i==1752&&j==9) { day-=11; } if(day%7>0&&day%7<4) { suml++; sumg++; } } } } flat=0; if(leap(i)) { flat=1; } if(i==ys) { j=ms; } else { j=1; } if(flat) { for(; j<=me; j++) { day+=lmonth[j]; if(i==1752&&j==9) { day-=11; } if(day%7>0&&day%7<4) { suml++; if(j!=me) { sumg++; } } } } else { for(; j<=me; j++) { day+=month[j]; if(i==1752&&j==9) { day-=11; } if(day%7>0&&day%7<4) { suml++; if(j!=me) { sumg++; } } } } printf("%d %d\n",suml,sumg); } return 0; }