思路很简单,运用sprintf函数把数字转换成字符,这样年就是数组下标0-3,月就是4-5,日就是6-7,然后判断一下是不是回文就行了。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. // 检查日期是否为回文
  5. int fun(int n) {
  6. char arr[9]; // 定义字符数组用于存储日期
  7. sprintf(arr, "%d", n); // 将整数日期格式化为字符串
  8. // 检查日期是否有效(月份和日期的有效范围)
  9. if (arr[4] - '0' >= 2 || arr[6] - '0' >= 3 ||
  10. (arr[4] - '0' == 0 && arr[5] - '0' == 0) || // 检查日期是否为00
  11. (arr[6] - '0' == 0 && arr[7] - '0' == 0)) { // 检查月份是否为00
  12. return 0; // 如果无效,返回0
  13. }
  14. int right = 0, left = strlen(arr) - 1; // 设置左右指针用于回文检查
  15. while (right < left) { // 只需比较到中间
  16. if (arr[right] == arr[left]) { // 如果对应字符相同
  17. right++; // 移动右指针
  18. left--; // 移动左指针
  19. }
  20. else return 0; // 如果不相同,返回0
  21. }
  22. return 1; // 如果是回文,返回1
  23. }
  24. // 检查日期是否为 ABABBABA 型回文
  25. int fun_1(int n) {
  26. char arr[9]; // 定义字符数组用于存储日期
  27. sprintf(arr, "%d", n); // 将整数日期格式化为字符串
  28. // 检查日期是否有效(月份和日期的有效范围)
  29. if (arr[4] - '0' >= 2 || arr[6] - '0' >= 3 ||
  30. (arr[4] - '0' == 0 && arr[5] - '0' == 0) || // 检查日期是否为00
  31. (arr[6] - '0' == 0 && arr[7] - '0' == 0)) { // 检查月份是否为00
  32. return 0; // 如果无效,返回0
  33. }
  34. // 检查 ABABBABA 型的回文条件
  35. if (arr[0] == arr[2] && arr[1] == arr[3]) { // 第1、3位与第2、4位相等
  36. if (arr[4] == arr[3] && arr[6] == arr[1]) { // 第5位与第4位,第7位与第2位相等
  37. if (arr[5] == arr[2] && arr[7] == arr[0]) { // 第6位与第3位,第8位与第1位相等
  38. return 1; // 满足条件,返回1
  39. }
  40. else return 0; // 不满足条件,返回0
  41. }
  42. else return 0; // 不满足条件,返回0
  43. }
  44. else return 0; // 不满足条件,返回0
  45. }
  46. int main(int argc, char* argv[]) {
  47. int n; // 定义输入变量
  48. scanf("%d", &n); // 从标准输入读取日期
  49. // 查找下一个回文日期
  50. for (int i = n + 1; i <= 99999999; i++) { // 从n+1开始查找
  51. if (fun(i)) { // 如果找到回文日期
  52. printf("%d\n", i); // 输出回文日期
  53. break; // 结束循环
  54. }
  55. }
  56. // 查找下一个 ABABBABA 型回文日期
  57. for (int i = n + 1; i <= 999999999; i++) { // 从n+1开始查找
  58. if (fun_1(i)) { // 如果找到 ABABBABA 型回文日期
  59. printf("%d", i); // 输出该日期
  60. break; // 结束循环
  61. }
  62. }
  63. return 0; // 程序结束
  64. }
点赞(2)
 

9.9 分

2 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论