第十一届蓝桥杯C/C++省赛B组第二场 试题G:回文日期(20分)

该C++代码实现了一个函数来检查从n+1到8999的年份中,日期是否遵循特定模式(如ABABBABA且在闰年2月29日之后),并输出符合条件的年份和月份
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
只需要枚举年份就可以

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
typedef long long LL;

void i2s(int num, string &s) { //数字转字符串
    stringstream ss;
    ss << num;
    ss >> s;
}

void s2i(int &num, string s) { //字符串转数字
    stringstream ss;
    ss << s;
    ss >> num;
}

bool isLeap(int year) {
    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    }
    return false;
}

bool judgeDay(int year, int month, int day) { //闰年非闰年分开判断
    int LeapMonthList[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int NoLeapMonthList[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if ( (isLeap(year) && day >= 1 && day <= LeapMonthList[month]) ||
         (!isLeap(year) && day >= 1 && day <= NoLeapMonthList[month]) ) {
             return true;
    }
    return false;
}

int main() {
    LL n;
    cin >> n;
    n /= 10000; //取得年份
    bool flag = false;
    for (int i = n + 1; i <= 8999; i++) {
        string num;
        i2s(i, num);
        //string temp = num;
        reverse(num.begin(), num.end());

        string pre = num.substr(0, 2), nex = num.substr(2, 4);
        int month, day;
        s2i(month, pre);
        s2i(day, nex);

        if (month >= 1 && month <= 12) {    //是0-12的月份
            if (judgeDay(i, month, day) && !flag) { //判断天数
                cout << i << pre << nex << endl;
                flag = true;
            }
            //判断ABABBABA
            if (judgeDay(i, month, day) && num[0] == num[2] && num[1] == num[3] && num[0] != num[1]) {
                cout << i << pre << nex << endl;
                break;
            }
        } else {
            continue;
        }
    }
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值