2012年4月1日,北京是人民政府根据《中华人民共和国道路交通安全法》和《北京市实施〈中华人民共和国大气污染防 治法〉办法》有关规定,自2012年4月11日起,继续对机动车实施按车牌尾号工作日高峰时段 区域限行交通管理措施。
根据规定,按车牌尾号限行的机动车车牌尾号分为五组,每13周轮换一次限行日,分别为:
(1) 自2012年4月9日至2012年7月7日,星期一至星期五限行机动车车牌尾号分别为:3和8、4和9、5和0、1和6、2和7(含临时号牌,机动车车牌尾号为英文字母的按0号管理,下同);
(2) 自2012年7月8日至2012年10月6日,星期一至星期五限行机动车车牌尾号分别为:2和7、3和8、4和9、5和0、1和6;
(3) 自2012年10月7日至2013年1月5日,星期一至星期五限行机动车车牌尾号分别为:1和6、2和7、3和8、4和9、5和0;
(4) 自2013年1月6日至2013年4月10日,星期一至星期五限行机动车车牌尾号分别为:5和0、1和6、2和7、3和8、4和9。
现给出 2012 年 4 月 9 日之后的任意日期,如果不考虑国家统一的公假,只考虑日期一个因素,请计算指定日期要限行的车牌尾号。
(政府的公告确实有点意思,在时间衔接上和限号安排上公告(http://unn.people.com.cn/GB/14748/17574443.html)与公告(http://www.gov.cn/gzdt/2013-04/02/content_2367908.htm)之间有重叠,显然,后面的公告是覆盖前面的公告的,我们计算的时候,只能是“理论”上的事情,咱严格按照从 2012年4月9日 星期一 开始,每 13 周进行一次轮换计算就可以了。)
#include <stdio.h>
int f(int x)
{
if(x%4==0&&x%100!=0||x%400==0) return 1;
else return 0;
}
int g(int x)
{
if(x<1) return g(x+5);
else if(x>5) return g(x-5);
else return x;
}
main()
{
int year,month,date,day=-100,m,n,b;
int a[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
scanf("%d %d %d",&year,&month,&date);
if(year==2012) day++;
while(--year>2011) day+=f(year)+365;
while(--month) day+=a[f(year)][month];
day+=date;m=day/7/13;n=day%7;
if(n==5||n==6) printf("Free.\n");
else
{
b=g(g(3-m)+n);
if(b!=5) printf("%d and %d.\n",b,b+5);
else printf("5 and 0.\n");
}
}
递归,算术