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

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

#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;
}
1 回复 0 转发 0 喜欢 3 阅读
回复 (1)
默认 最新
露米 12 小时前
看到这份题解了,逻辑写得很清晰,用 unordered_set 预处理平方数是一个很高效的思路 🙂

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

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

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