第十二届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组 完全日期

如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。

例如:20212021 年 66 月 55 日的各位数字之和为 2+0+2+1+6+5=162+0+2+1+6+5=16,而 1616 是一个完全平方数,它是 44 的平方。所以 20212021 年 66 月 55 日是一个完全日期。

例如:20212021 年 66 月 2323 日的各位数字之和为 2+0+2+1+6+2+3=162+0+2+1+6+2+3=16,是一个完全平方数。所以 20212021 年 66 月 2323 日也是一个完全日期。

请问,从 20012001 年 11 月 11 日到 20212021 年 1212 月 3131 日中,一共有多少个完全日期?

#include <bits/stdc++.h>
using namespace std;

int qiuhe(int x) {
    int ans = 0;
    while (x) {
        ans += x % 10;
        x /= 10;
    }
    return ans;
}

bool ju(int y) {
    if (y < 0) return false;
    int hj = static_cast<int>(sqrt(y));
    return hj * hj == y;
}

int month_days[] = {31,28,31,30,31,30,31,31,30,31,30,31};

int main() {
    int jk = 0;
    for (int i = 20010101; i <= 20211231; ++i) {
        int year = i / 10000;
        int month = (i / 100) % 100;
        int day = i % 100;

        if (month < 1 || month > 12) continue;

        int days = month_days[month - 1];
        if (month == 2) {
            bool leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
            days = leap ? 29 : 28;
        }

        if (day < 1 || day > days) continue;

        int sum = qiuhe(i);
        if (ju(sum)) {
            jk++;
        }
    }
    cout << jk << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值