这个题目一直有两个样例没过一直找不到

题目描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。

也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述
输入包含一个八位整数 NN,表示日期。

对于所有评测用例,10000101 \leq N \leq 8999123110000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。

输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例
示例
输入

20200202
copy
输出

20211202
21211212
copy
运行限制
最大运行时间:1s
最大运行内存: 256M
总通过次数: 8833 | 总提交次数: 14054 | 通过率: 62.9%

难度: 中等 标签: 模拟, 构造, 2020, 省赛

版权声明

用代码块功能插入代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

```c
#include<stdio.h>
int main(){
int rizi;
scanf("%d",&rizi);
int i,j,year,yr,month,data;
int t=0;
int a,b,c,d,e,f,g,h;
for(i=rizi+1;;i++)
{
    year=i/10000;
    yr=i%10000;
    month=yr/100;
    data=yr%100;
   if(month>12){i=i+8799;i--;}
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(data>31){i=i+70;i--;}}
    else if(month==4||month==6||month==9||month==11){if(data>30){i=i+71;i--;}}
    else if(month==2){if((year%4==0&&year%100!=0)||year%400==0){if(data>29){i=i+72;i--;}} else {if(data>28){i=i+73;i--;}}}

    a=year/1000;
    b=yr%10;
    c=year/100;c=c%10;
    d=yr%100;d=d/10;
    e=year%100;e=e/10;
    f=yr/100;f=f%10;
    g=year%10;
    h=yr/1000;
    if(a==b&&c==d&&e==f&&g==h){printf("%d",i);printf("\n");break;}
}
for(i=i+1;;i++)
{
    year=i/10000;
    yr=i%10000;
    month=yr/100;
    data=yr%100;
   if(month>12){i=i+8799;i--;}
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){if(data>31){i=i+70;i--;}}
    else if(month==4||month==6||month==9||month==11){if(data>30){i=i+71;i--;}}
    else if(month==2){if((year%4==0&&year%100!=0)||year%400==0){if(data>29){i=i+72;i--;}} else {if(data>28){i=i+73;i--;}}}

    a=year/1000;
    b=yr%10;
    c=year/100;c=c%10;
    d=yr%100;d=d/10;
    e=year%100;e=e/10;
    f=yr/100;f=f%10;
    g=year%10;
    h=yr/1000;
    if(a==b&&e==a&&a==f&&c==d&&c==g&&c==h){printf("%d",i);break;}
}

return 0;
}


```

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

// 判断是否为回文数
bool is_palindrome(int num) {
// 将数字转换为字符串
char str[9];
sprintf(str, "%d", num);
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - i - 1]) {
return false;
}
}
return true;
}

int main() {
int date;
scanf("%d", &date);
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;

// 求下一个回文日期
while (!is_palindrome(date)) {
    date++;
    if (date % 10000 == 1332) {
        date += 6869;
    }
    if (date % 100 == 32) {
        date += 68;
    }
}
printf("%d\n", date);

// 求下一个ABABBABA型的回文日期
while (true) {
    date++;
    if (date % 10000 == 1332) {
        date += 6869;
    }
    if (date % 100 == 32) {
        date += 68;
    }
    year = date / 10000;
    month = date % 10000 / 100;
    day = date % 100;
    if (year / 1000 == day % 10 && year / 100 % 10 == month / 10 &&
        year / 10 % 10 == day / 10 && year % 10 == month % 10) {
        printf("%d\n", date);
        break;
    }
}

return 0;
}