大佬们!64求助

P2010 [NOIP2016 普及组] 回文日期

ccrxx @ 2022-05-11 11:16:03

使用字符串存储日期,根据其中年份来构造要求的日期, 卡在 64 过不去了,看了下别的回答都是用 int 来存储构造的,找不出哪里出问题...
帮忙看看

#include <iostream>
#include <cstring>

using namespace std;

char start[15];
char endf[15];

int mdays[13] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main() {
    int cnt = 0;
    fgets(start, 15, stdin);
    fgets(endf, 15, stdin);

    int syear = 0, eyear = 0;
    for (int i = 0; i < 4; i++) {
        syear += ((start[i]-'0')*10);
        eyear += ((endf[i]-'0')*10);
    }

    bool flag = false;      // 是否小于初始日期

    bool firstYear = true;
    int firstmonth = (start[4]-'0')*10 + (start[5]-'0');
    int firstday = (start[6]-'0')*10 + (start[7]-'0');
    int lastmonth = (endf[4]-'0')*10 + (endf[5]-'0');
    int lastday = (endf[6]-'0')*10 + (endf[7]-'0');

    bool r_year = false;
    while (syear <= eyear) {         // 一年最多一个 用年份来构造
        int month = (start[3]-'0')*10 + start[2]-'0';       // 该年回文日期要求的 月
        int day = (start[1]-'0')*10 + start[0]-'0';         // 该年回文日期要求的 日

        int lmonth = 12;
        int lday = 31;

        if (syear == eyear) {       // 最后一年     月 和 天 最大界限更新下
            lmonth = lastmonth;
            lday = lastday;
        }

        syear += 1;
        int tmp = syear;                    // 准备构造下一年的回文日期的:月 天
        for (int i = 3; i >= 0; i--) {
            start[i] = (tmp%10) + '0';
            tmp /= 10;
        }

        // 判断月份 和 日期是否超界限
        if (month > lmonth || day > 31 || month == 0) {
            continue;
        }
        if (month == lmonth && day > lday) {        // 最后一年的回文日期 超过日期界限
            continue;
        }

        // 这个 if 判断第一年回文日期是否小于起始日期
        if (firstYear == true) {
            firstYear = false;
            if (month < firstmonth) {
                flag = true;
            }
            if (month == firstmonth && day < firstday) {
                flag = true;
            }
        }
        if (flag) {                             // 第一年回文日期 小于起始日期界限
            flag = false;
            continue;
        }

        if (mdays[month] >= day) {              // 合法的月份 和天数
            cnt++;
        }
    }

    cout << cnt;
    return 0;
}

|