返回题解分享
讨论 / 题解分享/ 帖子详情

完全日期(结果填空) - 题解

#include <cstdio>
#include <string>
#include <unordered_set> 

using namespace std;

int main() {
	unordered_set<int> hash;
	
	for (int i = 1; i < 21; ++i)
		hash.insert(i * i);
	
    int res = 0;
    for (int y = 2001; y <= 2021; ++y) {
        for (int m = 1; m <= 12; ++m) {
            for (int d = 1; d <= 31; ++d) {
                // 这里是模版
                if (!(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)) {
                    if (m == 2) { // 闰年: 可以被400整除 或者 被4而不能被100整除的年
                        if (m % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) { // 如果是润年 
                            if (d > 29)
                                break;
                        } else {
                            if (d > 28)
                                break;
                        }
                    } else {
                        if (d > 30)
                            break;
                    }
                }

                int sum = 
					y % 10 + y /10 % 10 + y /100 % 10 + y / 1000 % 10 + 
					m % 10 + m / 10 % 10 +
					d % 10 + d / 10 % 10;
				
				if (hash.count(sum)) {
					++res;
					printf("%d-%d-%d -> %d\n", y, m, d, sum);
				}
					
            }
        }
    }
    
    printf("%d", res);
    
    return 0;
}
2 回复 0 转发 0 喜欢 8 阅读
回复 (2)
默认 最新
露米 2026/2/5
看到你呼唤我啦。是不是在尝试调整那段判断逻辑呢?

其实这种日期类题目,最容易在闰年和月份边界上卡住,稍微一点点变量名的小误触都很正常。一旦把逻辑理顺了,跑通代码的那一刻成就感是很强的。

如果你已经试着把月份天数写成数组,或者修正了那个小变量,可以再发出来分享一下呀。我很期待看到优化后的逻辑是不是变得更清爽了 🙂
或者在实现过程中,有没有遇到什么让你觉得比较绕的地方?

如果你觉得哪里还可以写得更优雅,或者在调试时发现了新的小惊喜,也可以随时叫我,我们再一起讨论。加油,一点点打磨代码的过程,本身就是很有意义的进步呢。
0
露米 2026/2/4
看到这份题解了,逻辑写得很清晰,用 unordered_set 预处理平方数是一个很高效的思路 🙂

不过在看闰年判断的那一行时,我发现了一个小细节:m % 400 这里是不是原本想写 y % 400 呢?可能是敲代码的时候手快了一点点,调整过来就更完美了。

另外,关于月份天数的判断,如果尝试用一个数组把每个月的天数提前存起来,代码可能会变得更简洁、更不容易出错。你可以往这个方向试试看,感觉逻辑会清爽很多。

这道题的整体思路已经很完整了,慢慢来就好。
0