回文日期(枚举)

本文介绍了一种高效的算法,用于寻找给定整数之后的第一个回文日期和符合条件的ABABBABA型日期。通过枚举年份和拼接,作者分享了如何判断闰年并确定日期格式,从而简化了搜索过程。

 要求输入一个八位整数N,输出要求第一个输出下一个回文日期,第二个表示下一个ABABBABA的回文日期

算法分析:

有多种枚举的方法,一种是直接从输入的整数开始,依次加一开始验证,知道符合输出要求。但是这种算法复杂度较高,所以比较好的方法就是从输入日期开始枚举年份,然后将其翻转得到y,两个拼接起来就是答案,在判断是否是ABABBABA型的就可以了。

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<string>

using namespace std;
int D[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };  //12个月份,为了月份和数组下标统一加个-1.

bool check(int y)                 //判断是否为闰年
{
	if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
	{
		return true;
	}
	return false;
}
bool ok(string s)    //判断是否为ABABBABA型回文数字
{
	if (s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && s[1] == s[3] && s[1] == s[4] && s[1] == s[6])
		return true;
	return false;
}
int main()
{
	string S, ans1 = "", ans2 = "";
	cin >> S;
	for (int i = stoi(S.substr(0, 4)); ans1 =="" || ans2 == ""; i++)  //如果ans1和ans2有符合的就结束
	{
		string s = to_string(i), t = to_string(i);
		reverse(t.begin(), t.end());   //倒置函数
		s += t;                        //拼接起来
		if (s <= S)                     //如果小于输入就跳过
			continue;
		int y = stoi(s.substr(0, 4)), m = stoi(s.substr(4, 2)); //stoi变字符串为数字,substr是截图字符串函数
		int d = stoi(s.substr(6, 2));
		if (check(y))                      //闰年二月份改为29
			D[2] = 29;
		else
			D[2] = 28;
		if (m < 1 || m>12)          //不符合月份的跳过
			continue;  
		if (d < 1 || d> D[m])       //不符合天数的跳过
			continue;
		if (ans1 == "")               //符合就赋值
			ans1 = s;
		if (ok(s) && ans2== "")
			ans2= s;
	}
	cout << ans1 << "\n" << ans2 << endl;


}

### 关于洛谷平台上的回文日期问题及其 Java 实现 #### 1. **问题描述** 在洛谷平台上,与回文日期相关的题目通常涉及判断某个日期是否为回文以及统计特定范围内满足条件的回文日期数量。例如,在蓝桥杯竞赛中提到的一类问题是:给定一个日期范围,找出其中所有的回文日期并返回其总数。 #### 2. **实现方法** 为了高效解决此类问题,可以采用以下策略: - 使用 `Calendar` 类来操作日期对象,便于提取年、月、日信息[^1]。 - 将日期转换为字符串形式以便验证其是否具有回文特性。 - 避免使用可能导致性能瓶颈的输入方式(如 `Scanner`),推荐改用更高效的 `BufferedReader` 和 `StringTokenizer` 组合[^2]。 以下是基于上述逻辑的一个通用解决方案代码示例: ```java import java.io.*; import java.util.*; public class PalindromeDate { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String startDateStr = br.readLine(); // 起始日期 (YYYYMMDD) String endDateStr = br.readLine(); // 结束日期 (YYYYMMDD) int startYear = Integer.parseInt(startDateStr.substring(0, 4)); int endYear = Integer.parseInt(endDateStr.substring(0, 4)); Calendar calendar = Calendar.getInstance(); calendar.set(Integer.parseInt(startDateStr.substring(0, 4)), Integer.parseInt(startDateStr.substring(4, 6)) - 1, Integer.parseInt(startDateStr.substring(6))); long startTimeInMillis = calendar.getTimeInMillis(); calendar.set(Integer.parseInt(endDateStr.substring(0, 4)), Integer.parseInt(endDateStr.substring(4, 6)) - 1, Integer.parseInt(endDateStr.substring(6))); long endTimeInMillis = calendar.getTimeInMillis(); int palindromeCount = 0; while (startTimeInMillis <= endTimeInMillis) { String dateStr = formatDate(calendar); if (isPalindrome(dateStr)) { palindromeCount++; } calendar.add(Calendar.DAY_OF_MONTH, 1); // 移动到下一天 startTimeInMillis = calendar.getTimeInMillis(); } System.out.println(palindromeCount); } private static boolean isPalindrome(String s) { int i = 0; int j = s.length() - 1; while (i < j) { if (s.charAt(i++) != s.charAt(j--)) { return false; } } return true; } private static String formatDate(Calendar c) { StringBuilder sb = new StringBuilder(); sb.append(String.format("%04d", c.get(Calendar.YEAR))) .append(String.format("%02d", c.get(Calendar.MONTH) + 1)) .append(String.format("%02d", c.get(Calendar.DAY_OF_MONTH))); return sb.toString(); } } ``` 此程序实现了从标准输入读取起始和结束日期,并逐一检查这些天中的每一个是否构成回文日期的功能[^5]。 #### 3. **注意事项** - 在实际比赛中应特别注意边界情况,比如闰年的二月份有29天而非常规的28天。 - 对于大跨度的时间区间,暴力枚举可能不是最优的选择;可以通过预处理或者数学推导减少不必要的迭代次数[^3]。 #### 4. **总结** 通过合理运用 Java 的内置库函数配合简单的算法设计,能够有效应对诸如回文日期这样的典型编程挑战题型。同时也要记得针对不同场景选取合适的工具和技术手段以提升效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值