这是一个讨厌的英文阅读题+讨厌的模拟题。
这真是个锻炼英语阅读和代码实现能力的好题啊!!!
题目大意是这样的:
大致题意:
科普文一篇,文章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;
}