题目传送门
题目大意:
多组输入。
给出起始和终止时间(day),将年月日合成为一个字符串,找出其中含有“202”的天数;例如:“20201111”,“11120211”均为含有“202”的日期。
Example:
input:
3
2111 02 01 2111 02 03
2202 01 01 2202 12 31
2000 01 01 9999 12 31
output:
1
365
44294
思路:
对于完整的年份,当我们知道他是多少年的时候,就已经知道他有多少个含有“202”的日期了。对于不完整的年份,我选择暴力遍历每一天,不然的话情况太复杂了。
#include <bits/stdc++.h>
using namespace std;
int run(int y)
{
if((y%4==0&&y%100!=0)||y%400==0)
return 1;
return 0;
}
int nian(int y)
{
if(y/10==202||y%1000==202)
return 1;
if(y%10==2)
return 2;
else
return 0;
}
int yue(int x,int y)
{
if(y==1||y==3||y==5||y==7||y==8||y==10||y==12)
return 31;
if(y==2)
{
if((x%4==0&&x%100!=0)||x%400==0)
return 29;
else
return 28;
}
return 30;
}
int ff(int x,int y,int z)
{
if(x%1000==202||x/10==202)
return 1;
if(x%10==2&&y==2)
return 1;
if(y%10==2&&z==2)
return 1;
return 0;
}
int main()
{
int a1,b1,c1,a2,b2,c2,x,t;
scanf("%d",&t);
while(t--)
{
int ans=0;
int f1,f2;
scanf("%d %d %d %d %d %d",&a1,&b1,&c1,&a2,&b2,&c2);
for(int i=a1+1; i<a2; i++)
{
f1=nian(i);
if(f1==1)
{
f2=run(i);
if(f2==1)
ans+=366;
else
ans+=365;
}
else if(f1==2)
{
f2=run(i);
if(f2==1)
ans+=30;
else
ans+=29;
}
else
ans+=2;
}
if(a1<a2)
{
for(int i=b1; i<=12; i++)
{
x=yue(a1,i);
for(int j=1; j<=x; j++)
{
if(i==b1&&j<c1)
continue;
if(ff(a1,i,j)==1)
ans++;
}
}
for(int i=1; i<=b2; i++)
{
x=yue(a2,i);
for(int j=1; j<=x; j++)
{
if(i==b2&&j>c2)
continue;
if(ff(a2,i,j)==1)
ans++;
}
}
}
else if(a1==a2)
{
for(int i=b1; i<=b2; i++)
{
x=yue(a1,i);
for(int j=1; j<=x; j++)
{
if(i==b1&&j<c1)
continue;
if(i==b2&&j>c2)
continue;
if(ff(a1,i,j)==1)
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}