作业介绍
算法学习步骤
- 严禁照着老师的代码编写完成
- 只给思路不给实现,学生需要逐步培养运用思路就能完成题目的能力。
回文日期
暴力思路:
- 罗列 之间的所有日期。
for (int i = st; i <= ed; i++)
- 检验 是不是合法日期,且检验它是不是回文日期。
判断合法日期
判断一个数字 是不是合法日期主要通过以下几个步骤。
- 通过
to_string()函数将 转为字符串 - 通过
substr(), stoi()函数分别将字符串的下标 保存到一个年的变量,下标 的部分保存到一个月的变量,下标 的部分保存到一个日的变量
string s = to_string(i);
int y = stoi(s.substr(0, 4));
int m = ;
int d = ;
- 接下来检验 是否处在 之间。
- 接下来检验 是否在对应月份的日期范围内。
这里需要注意平年闰年带来的二月的差异,可以使用两个日期数组,使用数组判断,或者结合非常多的 if 语句。
判断回文
利用字符串和 reverse() 函数翻转字符串,与翻转前的比较即可。
string s = to_string(i);
string t = s;
reverse(t.begin(), t.end());
if (s == t) 说明是回文
暴力做法会超时,因为枚举 之间的日期实在太多了。考虑创造一个回文。
只枚举前四位年份,直接把年份翻转过去,拼起来就可以得到一个回文数字。这样只会枚举所有的四位数,大大缩减了枚举的可能。
在这之前,首先我们需要在 中分别提取前四位出来。
string s = to_string(st);
int start = stoi(s.substr(0, 4));
s = to_string(ed);
int end = stoi(s.substr(0, 4));
接下来遍历 之间的年份即可。
for (int i = start; i <= end; i++)
{
string s = to_string(i); // s = "2012"
string t = s;
reverse(t.begin(), t.end()); // t = "2102"
string j = s + t; // j = s + t = "20122102"
// 检验 j 是不是正常日期
if (check(j)) // j 是合法日期就继续判断 j 是不是回文
{
}
}
最后统计符合要求的日期个数,输出答案即可。
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 3
- 开始时间
- 2024-3-1 0:00
- 截止时间
- 2034-3-1 23:59
- 可延期
- 24 小时