题面
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如: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 协议进行许可 |