头像

Cyan

四川成都

深度强化学习炼丹师

2021第十二届蓝桥杯国赛-C完全日期

2021第十二届蓝桥杯国赛-C完全日期

2021-07-03 · 44次阅读 · 原创 · 数据结构与算法

题面

【问题描述】

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

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

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

请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日期?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

暴力枚举每一个日期,判断其各个位置的和是否为完全日期即可。具体见下面代码。

答案: 977

代码

#include<bits/stdc++.h> using namespace std; int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月份的天数 set<int> Set; //存放完全平方数的集合 //闰年判断 bool leap(int y) { return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; } //获取 x 的每个十进制位的和 int get(int x) { int ans = 0; while (x) { ans += x % 10; x /= 10; } return ans; } int main() { for (int i = 1; i <= 1000; i++) Set.insert(i * i); //枚举每个完全平方数 int ans = 0; //存放答案 for (int i = 2001; i <= 2021; i++) { for (int j = 1; j <= 12; j++) { int dd = days[j]; if (j == 2 && leap(i)) dd++; //是二月份且为闰年,当月天数加 1 for (int k = 1; k <= dd; k++) { int x = get(i) + get(j) + get(k); if (Set.count(x)) ans++; } } } cout << ans << endl; return 0; }

标题: 2021第十二届蓝桥杯国赛-C完全日期
链接: https://www.fightingok.cn/detail/99
更新: 2022-09-18 22:38:41
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可