1 条题解
-
0
枚举范围内的日期,判断是否合法且回文
#include <bits/stdc++.h> using namespace std; // 2. 真实存在的日期 // 传入年份与月份 返回这个月的天数 int getDay(int y, int m) { if (m == 4 || m == 6 || m == 9 || m == 11) return 30; if (m != 2) return 31; if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 29; return 28; } bool check2(int x) { // x: 20250329 int y = x / 10000; int m = x / 100 % 100; int d = x % 100; if (m < 1 || m > 12) return false; if (d < 1 || d > getDay(y, m)) return false; return true; } // 3. 回文 bool check3(int x) { // abcdefgh int a = x / 10000000 % 10; int b = x / 1000000 % 10; int c = x / 100000 % 10; int d = x / 10000 % 10; int e = x / 1000 % 10; int f = x / 100 % 10; int g = x / 10 % 10; int h = x / 1 % 10; return a == h && b == g && c == f && d == e; } int main() { int date1, date2; cin >> date1 >> date2; int cnt = 0; // 1. date1 ~ date2 // 2. 真实存在的日期 // 3. 回文 for (int i = date1; i <= date2; i++) { if (check2(i) && check3(i)) { cnt++; //cout << i << "\n"; } } cout << cnt; return 0; }
枚举所有存在的日期,判断是否在范围内且回文
#include <bits/stdc++.h> using namespace std; int date1, date2; // 1. date1 ~ date2 bool check1(int x) { return date1 <= x && x <= date2; } // 2. 真实存在的日期 // 传入年份与月份 返回这个月的天数 int getDay(int y, int m) { if (m == 4 || m == 6 || m == 9 || m == 11) return 30; if (m != 2) return 31; if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 29; return 28; } bool check2(int x) { // x: 20250329 int y = x / 10000; int m = x / 100 % 100; int d = x % 100; if (m < 1 || m > 12) return false; if (d < 1 || d > getDay(y, m)) return false; return true; } // 3. 回文 bool check3(int x) { // abcdefgh int a = x / 10000000 % 10; int b = x / 1000000 % 10; int c = x / 100000 % 10; int d = x / 10000 % 10; int e = x / 1000 % 10; int f = x / 100 % 10; int g = x / 10 % 10; int h = x / 1 % 10; return a == h && b == g && c == f && d == e; } int main() { cin >> date1 >> date2; int cnt = 0; // 1. date1 ~ date2 // 2. 真实存在的日期 // 3. 回文 for (int y = 1000; y <= 9999; y++) for (int m = 1; m <= 12; m++) for (int d = 1; d <= getDay(y, m); d++) { // y 年 m 月 d 日 int i = y * 10000 + m * 100 + d; if (check1(i) && check3(i)) cnt++; } cout << cnt; return 0; }
枚举所有回文八位数,判断是否在范围内且真实存在
#include <bits/stdc++.h> using namespace std; int date1, date2; // 1. date1 ~ date2 bool check1(int x) { return date1 <= x && x <= date2; } // 2. 真实存在的日期 // 传入年份与月份 返回这个月的天数 int getDay(int y, int m) { if (m == 4 || m == 6 || m == 9 || m == 11) return 30; if (m != 2) return 31; if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) return 29; return 28; } bool check2(int x) { // x: 20250329 int y = x / 10000; int m = x / 100 % 100; int d = x % 100; if (m < 1 || m > 12) return false; if (d < 1 || d > getDay(y, m)) return false; return true; } // 3. 回文 bool check3(int x) { // abcdefgh int a = x / 10000000 % 10; int b = x / 1000000 % 10; int c = x / 100000 % 10; int d = x / 10000 % 10; int e = x / 1000 % 10; int f = x / 100 % 10; int g = x / 10 % 10; int h = x / 1 % 10; return a == h && b == g && c == f && d == e; } int main() { cin >> date1 >> date2; int cnt = 0; // 1. date1 ~ date2 // 2. 真实存在的日期 // 3. 回文 for (int y = 1000; y <= 9999; y++) { // y: abcd // abcddcba int a = y / 1000 % 10; int b = y / 100 % 10; int c = y / 10 % 10; int d = y / 1 % 10; int i = y * 10000 + d * 1000 + c * 100 + b * 10 + a * 1; if (check1(i) && check2(i)) cnt++; } cout << cnt; return 0; }
另一种枚举回文数的方法:
// 3. 回文 for (int a = 1; a <= 9; a++) for (int b = 0; b <= 9; b++) for (int c = 0; c <= 9; c++) for (int d = 0; d <= 9; d++) { int i = a * 10000000 + b * 1000000 + c * 100000 + d * 10000 + d * 1000 + c * 100 + b * 10 + a * 1; if (check1(i) && check2(i)) cnt++; }
信息
- ID
- 101
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 99
- 已通过
- 27
- 上传者