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;
}