题解:P13876 [蓝桥杯 2023 省 Java/Python A] 特殊日期
思路
- 关键思路:对于每个年份,咱就直接检查其是否为每个月份的倍数,若是则遍历该月所有日期,检查年份是否为日期的倍数。
- 闰年处理:二月的天数根据闰年规则调整(能被4整除但不能被
100 整除,或能被400 整除的年份为闰年)。 - 边界处理:单独处理
2000000 年1 月1 日。
解决代码
#include <iostream>
using namespace std;
bool check(int a) // 判断闰年
{
if (a % 400 == 0)
return true;
if (a % 100 == 0)
return false;
return (a % 4 == 0);
}
int f(int a, int b) // 计算天数
{
if (b == 2)
{
return check(a) ? 29 : 28;
}
if (b == 4 || b == 6 || b == 9 || b == 11)
{
return 30;
}
return 31;
}
int main()
{
long long ans = 0;
for (int yy = 2000; yy < 2000000; yy++) // 遍历年
{
for (int mm = 1; mm <= 12; mm++) // 遍历月
{
if (yy % mm != 0)
continue;
int days = f(yy, mm);
for (int dd = 1; dd <= days; dd++)
{
if (yy % dd == 0)
{
ans++;
}
}
}
}
int yy = 2000000;
int mm = 1;
int dd = 1;
if (yy % mm == 0 && yy % dd == 0)
{
ans++;
}
cout << ans << endl;
return 0;
}
最终答案是