1、回文日期
简化代码的思想:
- 本题要找满足要求的回文串,我们可以直接在数据范围内的回文串里找满足要求的即可
- 由于数较大范围广,直接枚举会T;但考虑到在范围内的回文串里枚举,我们可以只用枚举前四位数
#include <bits/stdc++.h>
using namespace std;
int d1,d2,ans;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//十二个月
int res;
int main()
{
cin>>d1>>d2;
for(int i=d1/10000;i<=d2/10000;i++)//枚举前四位数
{
int cnt=1,right=0,k=i;
while(cnt<=4)//对称得到后四位
{
int t=k%10;
right=right*10+t;
k/=10;
cnt++;
}
//cout<<"right:"<<right<<" "<<"y:"<<i<<endl;
//right:102 y:2010
int m=right/100;
int d=right%100;
if(i>=d2/10000&&right>d2%10000||i<=d1/10000&&right<d1%10000) {continue;}//这里注意!前四位只是同年!在数据范围边界可能在日、月越界!
if(m>=1 && m<=12)
{
if(m==2)
if(i%4==0 && i%100!=0 || i%400==0)
{
if(d<=29)
ans++;
}
else
{
if(d<=28)
ans++;
}
else
{
if(d<=mon[m])
ans++;
}
}
}
//right:1002 y:2001
//right:102 y:2010
//right:1102 y:2011
cout<<ans<<endl;
return 0;
}
2、日期问题
这题如果直接按照题意暴力模拟非常的复杂。。。。
简化代码的思想:
这题求可能的年月日,且数据范围只有1百万,所以我们直接枚举所有年份找符合要求的可以省很多事。
#include <bits/stdc++.h>
using namespace std;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int y,int m,int d)
{
if(m<=0 || m>12) return false;
if(d==0) return false;
if(m!=2)
{
if(d>mon[m]) return false;
}
else
{
int pls= y%100!=0 && y%4==0 || y%400==0;
if(d>mon[m]+pls) return false;
}
return true;
}
int main()
{
int a,b,c;
scanf("%d/%d/%d", &a, &b, &c);//自动无视前导0
for(int i=19600101;i<=20591231;i++)
{
int y=i/10000,m=i%10000/100,d=i%100;
if(check(y,m,d))
{
if(y%100==a&&m==b&&d==c || //年月日
m==a&&d==b&&y%100==c || //月日年
d==a&&m==b&&y%100==c) // 日月年
printf("%d-%02d-%02d\n",y,m,d);//格式输出
}
}
return 0;
}