思路很简单,运用sprintf函数把数字转换成字符,这样年就是数组下标0-3,月就是4-5,日就是6-7,然后判断一下是不是回文就行了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 检查日期是否为回文
int fun(int n) {
char arr[9]; // 定义字符数组用于存储日期
sprintf(arr, "%d", n); // 将整数日期格式化为字符串
// 检查日期是否有效(月份和日期的有效范围)
if (arr[4] - '0' >= 2 || arr[6] - '0' >= 3 ||
(arr[4] - '0' == 0 && arr[5] - '0' == 0) || // 检查日期是否为00
(arr[6] - '0' == 0 && arr[7] - '0' == 0)) { // 检查月份是否为00
return 0; // 如果无效,返回0
}
int right = 0, left = strlen(arr) - 1; // 设置左右指针用于回文检查
while (right < left) { // 只需比较到中间
if (arr[right] == arr[left]) { // 如果对应字符相同
right++; // 移动右指针
left--; // 移动左指针
}
else return 0; // 如果不相同,返回0
}
return 1; // 如果是回文,返回1
}
// 检查日期是否为 ABABBABA 型回文
int fun_1(int n) {
char arr[9]; // 定义字符数组用于存储日期
sprintf(arr, "%d", n); // 将整数日期格式化为字符串
// 检查日期是否有效(月份和日期的有效范围)
if (arr[4] - '0' >= 2 || arr[6] - '0' >= 3 ||
(arr[4] - '0' == 0 && arr[5] - '0' == 0) || // 检查日期是否为00
(arr[6] - '0' == 0 && arr[7] - '0' == 0)) { // 检查月份是否为00
return 0; // 如果无效,返回0
}
// 检查 ABABBABA 型的回文条件
if (arr[0] == arr[2] && arr[1] == arr[3]) { // 第1、3位与第2、4位相等
if (arr[4] == arr[3] && arr[6] == arr[1]) { // 第5位与第4位,第7位与第2位相等
if (arr[5] == arr[2] && arr[7] == arr[0]) { // 第6位与第3位,第8位与第1位相等
return 1; // 满足条件,返回1
}
else return 0; // 不满足条件,返回0
}
else return 0; // 不满足条件,返回0
}
else return 0; // 不满足条件,返回0
}
int main(int argc, char* argv[]) {
int n; // 定义输入变量
scanf("%d", &n); // 从标准输入读取日期
// 查找下一个回文日期
for (int i = n + 1; i <= 99999999; i++) { // 从n+1开始查找
if (fun(i)) { // 如果找到回文日期
printf("%d\n", i); // 输出回文日期
break; // 结束循环
}
}
// 查找下一个 ABABBABA 型回文日期
for (int i = n + 1; i <= 999999999; i++) { // 从n+1开始查找
if (fun_1(i)) { // 如果找到 ABABBABA 型回文日期
printf("%d", i); // 输出该日期
break; // 结束循环
}
}
return 0; // 程序结束
}
9.9 分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复