LQ0018 顺子日期枚举+日期

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0018 顺子日期枚举+日期相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2022初赛 C++ B组B题

题目描述
小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。
顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。
例如20220123 就是一个顺子日期,因为它出现了一个顺子:123;
本题顺子的定义:i j k 是一个顺子,满足 i+1=j、j+1=k、i≥0。
而20221023 则不是一个顺子日期,它一个顺子也没有。
小明想知道在整个2022年份中,一共有多少个顺子日期。
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

问题分析
枚举2022年的每一天,判定一下是不是顺子日期,是的话计数一下就好了。

AC的C语言程序如下:

/* LQ0018 顺子日期 */

#include <stdio.h>

int mdays[] = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;

int leapyear(int year)

    return ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) ? 1 : 0;


int judge(char d[])

    for (int i = 1; i <= 6; i++)
        if (d[i - 1] + 1 == d[i] && d[i] + 1 == d[i + 1])
            return 1;
    return 0;


int main()

    int y = 2022, m, d, cnt = 0;
    char s[8 + 1];

    mdays[2] += leapyear(y);

    for (m = 1; m <= 12; m++)
        for (d = 1; d <= mdays[m]; d++) 
            sprintf(s, "%d", y * 10000 + m * 100 + d);
            if (judge(s))
                cnt++;
        

    printf("%d\\n", cnt);

    return 0;

以上是关于LQ0018 顺子日期枚举+日期的主要内容,如果未能解决你的问题,请参考以下文章

修建灌木&&顺子日期

[HIHO1177]顺子(暴力,枚举)

剑指offer--41.扑克牌顺子

LQ0150 回文日期枚举

BZOJ.1028.[JSOI2007]麻将(贪心)

leetcode刷题42.扑克牌中的顺子——Java版