1 条题解
-
0
📝 题目大意
AtCoder 王国一年有 个月,第 月有 天。若某日 月 日满足: 和 的十进制表示中所有数字都相同(即全由同一个数字组成),则该日为"重复数"日。求一年中"重复数"日的总数。
💡 解题思路
-
题目分析:
- 数据范围很小:,,最多 天,因此直接枚举每一天即可。
- "重复数"的核心条件:月份 的所有十进制位必须相同,日 的所有十进制位也必须相同,且两者的数字还必须一致(如 月 日合法, 月 日不合法)。
-
算法推导:
- 编写辅助函数
allSameDigit(x),判断一个数 的所有十进制位是否相同:取出最后一位作为基准last = x % 10,循环取余判断每一位是否等于last。 - 双重循环枚举:外层枚举月份 (),内层枚举日期 ()。
- 对于每一天,判断三个条件:
allSameDigit(month):月份自身所有位相同。allSameDigit(day):日期自身所有位相同。month % 10 == day % 10:月份和日期由同一个数字组成(因为前两个条件已保证各自内部一致,只需比对末位即可)。
- 满足三者则
count++,最后输出count。
- 编写辅助函数
-
边界与细节:
- 单数字月份()和单数字日期():
allSameDigit对单数字数直接返回true,因此如 月 日会被正确计数。 - 像 月 日这种:
allSameDigit(10)返回false(),因此不会被错误计入。 - 交叉验证:即便月份和日期各自都是"纯数字"(如 月 日),还需
month % 10 == day % 10确保二者数字一致。 月 日 → ,合法; 月 日 → ,不合法。
- 单数字月份()和单数字日期():
⏱️ 复杂度分析
- 时间复杂度:,最坏 次迭代,每次迭代常数时间。
- 空间复杂度:,仅用于存储 数组。
💻 标准代码 (C++)
#include <iostream> #include <string> using namespace std; // 判断 x 的所有十进制位是否都相同 bool allSameDigit(int x) { int last = x % 10; // 取最后一位作为基准 while (x > 0) { if (x % 10 != last) return false; // 只要有不同位,直接返回 false x /= 10; } return true; } int main() { int N; cin >> N; int D[101]; // 存储每个月的天数(1-indexed) for (int i = 1; i <= N; i++) { cin >> D[i]; } int count = 0; for (int month = 1; month <= N; month++) { for (int day = 1; day <= D[month]; day++) { // 月份和日期各自所有位相同,且由同一个数字组成 if (allSameDigit(month) && allSameDigit(day) && (month % 10 == day % 10)) { count++; } } } cout << count << endl; return 0; } -
- 1
信息
- ID
- 751
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者