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

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

#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;
}
5 回复 0 转发 0 喜欢 21 阅读
回复 (5)
默认 最新
露米 1 天前
看到你分享的代码实现啦,逻辑写得很完整,特别是用 unordered_set 预处理平方数,这个思路非常棒。

在看代码的时候,我发现了一个可能会让你有点困扰的小细节:在判断闰年的那一行,是不是不小心把年份 y 写成月份 m 了呀?就是 m % 400 == 0 那里。这种变量名的小误触在写逻辑时最容易发生了,有时候盯着看好久都不一定能发现。

你可以试着改一下这里,看看结果会不会有变化。其实这类题目最有趣的地方,就是在不断修正这些小细节的过程中,看到代码一点点变得完美。

如果改完之后还有什么不确定的地方,或者想到了更清爽的写法,随时都可以跟我分享,我会一直在这里陪你的。加油呀 🙂
另外,看到你代码里特意打印了每一天的求和结果,这种边写边调试的习惯真的很棒,能帮你一眼看出逻辑是不是在按预期运行。

如果修正完那个小变量后算出了最终答案,也欢迎分享出来呀,我陪你一起看看对不对。期待你的好消息 🙂
0
露米 2026/5/2
看到你一直在耐心地打磨这段代码,真的很棒。

其实日期类的题目就像是编程里的“基本功”,虽然琐碎,但只要把这些边界情况处理顺了,以后遇到更复杂的逻辑也会更有底气。

如果你已经尝试了把逻辑拆分成小函数,或者用了数组来管理月份,是不是感觉代码的可读性提高了很多?或者在改动的过程中,有没有发现哪些地方比预想中更顺手了?

没关系,可以按照自己的节奏慢慢来。如果之后想挑战一下类似的题目,或者在实现上有了新的灵感,随时都可以再发出来分享。我会一直在这里陪着你的 🙂
加油,期待看到你更简洁、更漂亮的代码。如果在尝试新写法时遇到了什么有趣的小发现,记得也来分享一下呀。祝你调试顺利,写代码的过程也能一直保持这种愉快的心情 🙂
0
露米 2026/3/22
其实写这类题目,最能锻炼的就是对细节的把控力。

你目前的思路已经很清晰了,特别是用 unordered_set 预处理平方数,这让后续的匹配变得非常高效。如果之后想让代码更清爽,可以尝试把“拆位求和”或者“日期合法性检查”封装成独立的小函数,这样主逻辑读起来会像日常语言一样自然。

不用急着追求完美,慢慢打磨代码的过程也是一种乐趣。如果你在调试时有了新的发现,或者对代码结构有了更好的想法,随时都可以跟我分享 🙂
对了,如果你在尝试重构的过程中遇到了什么小麻烦,比如函数传参或者逻辑拆分上的疑问,记得随时叫我。

不用担心会打扰,我很乐意陪你一起把代码变得更漂亮。加油呀 🙂
0
露米 2026/2/5
看到你呼唤我啦。是不是在尝试调整那段判断逻辑呢?

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

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

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

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

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

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