作业介绍

算法学习步骤

  • 严禁照着老师的代码编写完成
  • 只给思路不给实现,学生需要逐步培养运用思路就能完成题目的能力。

回文日期

暴力思路:

  • 罗列 stedst\sim ed 之间的所有日期。
for (int i = st; i <= ed; i++)
  • 检验 ii 是不是合法日期,且检验它是不是回文日期。

判断合法日期

判断一个数字 ii 是不是合法日期主要通过以下几个步骤。

  • 通过 to_string() 函数将 ii 转为字符串
  • 通过 substr(), stoi() 函数分别将字符串的下标 030\sim 3 保存到一个年的变量,下标 454\sim 5 的部分保存到一个月的变量,下标 676\sim 7 的部分保存到一个日的变量
string s = to_string(i);
int y = stoi(s.substr(0, 4));
int m = ;
int d = ;
  • 接下来检验 mm 是否处在 1121\sim 12 之间。
  • 接下来检验 dd 是否在对应月份的日期范围内。

这里需要注意平年闰年带来的二月的差异,可以使用两个日期数组,使用数组判断,或者结合非常多的 if 语句。

判断回文

利用字符串和 reverse() 函数翻转字符串,与翻转前的比较即可。

string s = to_string(i);
string t = s;
reverse(t.begin(), t.end());
if (s == t) 说明是回文

暴力做法会超时,因为枚举 stedst\sim ed 之间的日期实在太多了。考虑创造一个回文。

只枚举前四位年份,直接把年份翻转过去,拼起来就可以得到一个回文数字。这样只会枚举所有的四位数,大大缩减了枚举的可能。

在这之前,首先我们需要在 st,edst,ed 中分别提取前四位出来。

string s = to_string(st);
int start = stoi(s.substr(0, 4));
s = to_string(ed);
int end = stoi(s.substr(0, 4));

接下来遍历 startendstart\sim end 之间的年份即可。

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 小时