POJ 3393Lucky and Good Months by Gregorian Calendar

mac2022-06-30  145

这是一个讨厌的英文阅读题+讨厌的模拟题。

这真是个锻炼英语阅读和代码实现能力的好题啊!!!

题目大意是这样的:

大致题意:

科普文一篇,文章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)&&(year0)) || !(year@0)) { 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; }

转载于:https://www.cnblogs.com/lin375691011/p/3996738.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)