专栏文章

题解:P13876 [蓝桥杯 2023 省 Java/Python A] 特殊日期

P13876题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio3eqg7
此快照首次捕获于
2025/12/02 12:43
3 个月前
此快照最后确认于
2025/12/02 12:43
3 个月前
查看原文

思路

  • 关键思路:对于每个年份,咱就直接检查其是否为每个月份的倍数,若是则遍历该月所有日期,检查年份是否为日期的倍数。
  • 闰年处理:二月的天数根据闰年规则调整(能被4整除但不能被 100100 整除,或能被 400400 整除的年份为闰年)。
  • 边界处理:单独处理 200000020000001111 日。

解决代码

CPP
#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;
}
最终答案是 3581306335813063

评论

0 条评论,欢迎与作者交流。

正在加载评论...