不用写字符串比较的函数,找到该年份,直接将年份数字反过来就是对应日期,如果用两层for找意义不大,核心就是判断边界的长难句和基础知识
//https://ac.nowcoder.com/acm/problem/16438
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5;
int mon[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
bool judYear(int x) {
return x % 4 == 0 && x % 100 != 0 || x % 400 == 0;//闰年判断
}
int s_month(int x) {
return (x % 10) * 10 + (x % 100 - x % 10) / 10;
}
int s_date(int x) {
return x / 1000 + (x % 1000 - x % 100) / 10;
}
bool jud(int y, int m, int d,int md1,int md2,int y1,int y2) {
//md为开始的年份月份,如果开始在20211201,找的是20211102,这显然不合理,所以有26行和27行长难句,也可以拆开
int cnt = mon[m];
if (judYear(y) && m == 2)cnt++;
if (!(1 <= m && 12 >= m))return false;
if (!(1 <= d && cnt >= d))return false;
if ((y==y1&&(md1/100)>m)||(y==y1&&md1/100==m&&(md1%100)<d))return false;
if ((y==y2&&(md2/100)<m)||(y==y2&&md2/100==m&&(md2%100)>d))return false;
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int y1,md1,y2,md2;
//用格式%4d规定输入减少开始的转化
scanf("%4d%4d",&y1,&md1);
scanf("%4d%4d",&y2,&md2);
int ans = 0;
for (int i = y1; i <= y2; ++i) {
if (jud(i, s_month(i), s_date(i),md1,md2,y1,y2)) {
ans++;
}
}
cout << ans << endl;
return 0;
}