Source
题意:夏令时或者说成夏时制,表示每年的时间变迁——
每年3月份的第2个星期天的2:00会跃变为3:00,同时标准时从PST变为PDT;
每年11月份的第1个星期天的2:00会跃变为1:00,同时标准时从
现在随便给出一个2007年到2010年的一个时间点,要求判断这个时间点是PDT , PST , Both or Neither
思路:很明显需要打一个每年 PST变为PDT 和 PDT变为PST 的日期表(记为StoD[] 和 DtoS[])
用递推即可,因为平年365天模7余1 故同一日期的礼拜是往后移了一位 也即日期表往前减了一天(当然要处理越界),闰年366天也一样 只是减2. 另外判断闰年:四年一闰,百年不闰,四百年再闰
由于要用结构体存储 年月日时分秒,故后面比较大小时有必要——
在结构体内重载操作符:
bool operator < (const time &b) const {}
其中返回值类型:bool;
operator < —— 表示重载<运算符;
const time &b —— 参数内部的const是为了防止引用变量被改动,time即为结构体名
参数外部的const也有必要加上
代码如下:
#include<cstdio>
using namespace std;
int StoD[105],DtoS[105];
struct time
{
int y,mo,d,h,mi,s;
bool operator <(const time &b) const
{
if(y!=b.y) return y<b.y;
else if(mo!=b.mo) return mo<b.mo;
else if(d!=b.d) return d<b.d;
else if(h!=b.h) return h<b.h;
else if(mi!=b.mi) return mi<b.mi;
else return s<b.s;
}
};
int main()
{
int n,t,T;
StoD[7]=11;
DtoS[7]=4;
for(int i=8;i<=100;i++)
{
if(i%4 || i%100==0) //不是闰年
{
StoD[i]=StoD[i-1]-1;
if(StoD[i]<=7) StoD[i]+=7;
DtoS[i]=DtoS[i-1]-1;
if(DtoS[i]<1) DtoS[i]+=7;
}
else //是闰年
{
StoD[i]=StoD[i-1]-2;
if(StoD[i]<=7) StoD[i]+=7;
DtoS[i]=DtoS[i-1]-2;
if(DtoS[i]<1) DtoS[i]+=7;
}
}
time da;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%d-%d-%d %d:%d:%d",&da.y,&da.mo,&da.d,&da.h,&da.mi,&da.s);
time SN={da.y,3,StoD[da.y-2000],2,0,0};
time NP={da.y,3,StoD[da.y-2000],3,0,0};
time PB={da.y,11,DtoS[da.y-2000],1,0,0};
time BS={da.y,11,DtoS[da.y-2000],2,0,0};
if(da<SN) printf("Case #%d: PST\n",t);
else if(da<NP) printf("Case #%d: Neither\n",t);
else if(da<PB) printf("Case #%d: PDT\n",t);
else if(da<BS) printf("Case #%d: Both\n",t);
else printf("Case #%d: PST\n",t);
}
}