蓝桥杯2020--回文日期

蓝桥杯2020--回文日期_第1张图片
蓝桥杯2020--回文日期_第2张图片

解题思路
  1. 采用暴力和枚举的方法进行处理,先判断是否满足回文,如果满足再判断是否是ABAB类型,如果是则找到了结果.
  2. 处理时,第一次需要从输入日期的后一天开始进行判断
代码
#include
#include
using namespace std;
string s;
int year, month, day;
int month1, day1;
int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
bool flag1 = false, flag = true;//flag :判断是否是第一次循环   flag1: 判断是否找到回文 
bool solve1(string s)//判断回文的方法 
{
	for (int i = 0; i <= s.size() / 2; i++) {
		if (s[i] != s[s.size() - i - 1])
		{
			return false;
		}
	}
	return true;
}

bool solve2(string s) {//判断是否是ABAB类型的 
	if (s[0] == s[2] && s[1] == s[3]) {
		return true;
	}
	return false;
}
void solve(string s)// 处理问题的方法 
{
	year = stoll(s.substr(0, 4));
	month = stoll(s.substr(4, 2));
	day = stoll(s.substr(6, 2));
	//
	for (int i = year; i; i++)//年 
	{
		if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
		{
			months[2] = 29;
		}
		else
		{
			months[2] = 28;
		}
		if (flag) {
			month1 = month;
			day1 = day + 1;
			flag = false;
		}else {
			month1 = 1;
			day1 = 1;
		}
		for (int j = month1; j <= 12; j++)//月 
		{
			for (int k = day1; k <= months[j]; k++)
			{
				s = to_string(i);
				if (j < 10)
				{
					s += "0" + to_string(j);
				}
				else {
					s += to_string(j);
				}
				if (k < 10) {
					s += "0" + to_string(k);
				}
				else {
					s += to_string(k);
				}
				//cout << s << endl;
				if (solve1(s))//判断是否是回文 
				{
					//cout << s << endl;
					if (!flag1)//如果还没找到,则这个就是最近的那个 
					{
						cout << s << endl;
						flag1 = true;
					}
					if (solve2(s)) {//判断是否是ABAB类型的回文日期 
						cout << s << endl;
						return;
					}
				}
			}
		}
	}

}
int main()
{
	cin >> s;
	solve(s);
	return 0;
}
总结

C++11 中提供了许多方便的函数,比如 整形转换成字符串 to_string(),字符串转换成整形 stoll().这些使用起来还是很方便的.另外字符串只能和字符串用 + 做拼接,如果两边一边一个整数一边一个字符串类型则会出错.

你可能感兴趣的:(#,蓝桥杯,字符串,算法)