【每天例题】蓝桥杯 C语言 日期统计

日期统计

题目

小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示:

5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3

现在他想要从这个数组中寻找一些满足以下条件的子序列:

1. 子序列的长度为 8;

2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期,例如 20230902,20231223。

yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

请你帮小蓝计算下按上述条件一共能找到多少个不同 的 2023 年的日期。对于相同的日期你只需要统计一次即可。

题目要求

1.数组长度为100,每个元素值为0到9

2.子序列的长度为 8;

3. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且要求这个日期是 2023 年中的某一天的日期

yyyy 表示年份,mm 表示月份,dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

4.对于相同的日期你只需要统计一次即可。

思路分析

一、子序列定义

子序列即原数组按下标递增规律所挑出的子集,同时这个递增可以是没有规则的。

二、continue的用法

continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。注意:continue语句并没有使整个循环终止

三、

方法一

1.使用八个for循环,然后使用if筛选符合条件的数字

2.将月份与日拆分为4个int型数字,以for-if作为判断,筛选出不符合月份与日期的数字

3.进行日期判定

4.去重处理、

方法二

1,建立日期数组date[2,0,2,3,0,0,0,0]

2.然后寻找合适的数替代掉数组后四位数,通过for—if限制条件,通过遍历寻找合适的数,分两条线进行遍历,一条在100个数中寻找满足条件的数,一条在日期中标记搜寻到第几位

代码(方法一)

该代码使用八个循环过于累赘,且未能得出正确答案(跑不动......)

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include
int main()
{
    int a[45]={2,0,2,3,3,8,5,1,6,3,4,6,7,0,7,8,2,7,6,8,9,5,6,5,6,1,4,0,1,0,0,9,4,8,0,9,1,2,8,5,0,2,5,3,3};   //该数组经历人为筛选后
    int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int i,j,k,l,m,n,o,p;
    int a1,a2,a3,a4;
    int d[1232];
    int count=0;
    for (i=0;i<45;i++)
    {
        if (a[i]==   '2' )
        {
            for (j=i+1;j<45;j++)
            {
                if (a[j]==   '0' )
                {
                    for (k=j+1;k<45;k++)
                    {
                        if (a[k]==   '2' )
                        {
                            for (l=k+1;l<45;l++)
                            {
                                if (a[l]==   '3' )
                                {
                                    for (m=l+1;m<45;m++)
                                    {
                                        if (a[m]!=   '0' &&a[m]!=   '1' )
                                        {
                                            continue ;
                                        }
                                        for (n=m+1;n<45;n++)
                                        {
                                            if (a[m]==   '0' &&a[n]==   '0' )
                                            {
                                                continue ;
                                            }
                                            if (a[m]==   '1' &&a[n]>   '2' )
                                            {
                                                continue ;
                                            }
                                            for (o=n+1;o<45;o++)
                                            {
                                                if (a[o]>   '3' )
                                                {
                                                    continue ;
                                                }
                                                for (p=o+1;p<45;p++)
                                                {
                                                    if (a[o]==   '0' &&a[p]==   '0' )
                                                    {
                                                        continue ;
                                                    }
                                                    if (a[o]=   '3' &&a[p]>   '1' )
                                                    {
                                                        continue ;
                                                    }
                                                    a1=a[m];a2=a[n];a3=a[o];a4=a[p];
                                                    int month=a1*10+a2;
                                                    int day=a3*10+a4;
                                                    if (day<=days[month])
                                                    {
                                                        int Date=month*100+day;
                                                        if ((Date>=0101)&&(Date<=1231))
                                                        {
                                                            if (d[Date]==0)
                                                            {
                                                                d[Date]=Date;
                                                                count++;
                                                            }
                                                        }  
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }  
    }  
    printf(   "%d" ,count);
    return 0;          
}

代码(方法二)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int num[100]={5,6,8,6,9,1,6,1,2,4,9,1,9,8,2,3,6,4,7,7,5,9,5,0,3,8,7,5,8,1,5,8,6,1,8,3,0,3,7,9,2,7,0,5,8,8,5,7,0,
9,9,1,9,4,4,6,8,6,3,3,8,5,1,6,3,4,6,7,0,7,8,2,7,6,8,9,5,6,5,6,1,4,0,1,0,0,9,4,8,0,9,1,2,8,5,0,2,5,3,3};
 
int dfs(   int n[],   int date[],   int pos1,   int pos2)   //n是传进来的100个数,date是需要找的日期,pos1找到num第几位,pos2找date第几位
{
    if (pos2==8)   //我们已经遍历完,找到日期了
    {
        return 1;
    }
    if (pos1>=100)   //整个数组找完了,没有找到
    {
        return 0;
    }
    if (n[pos1]==date[pos2])   //当前位置的数是我们想要的数
    {
        return dfs(n,date,pos1+1,pos2+1);   //继续往下找
     }
     else //如果不是想要的数,那么就继续在数组找
     {
        return dfs(n,date,pos1+1,pos2);
     }
}  
int main()
{
    int date[8]={2,0,2,3,0,0,0,0};
    int count=0;
    int i,j;
    for (i=1;i<=12;i++)   //月份
    {
        if (i<10)
        {
            date[4]=0;
            date[5]=i;
        }
        else
        {
            date[4]=1;
            date[5]=i%10;
        }
        for (j=1;j<=days[i];j++)
        {
            if (j<10)
            {
                date[6]=0;
                date[7]=j;
            }
            else
            {
                date[6]=j/10;
                date[7]=j%10;
            }
            count+=dfs(num,date,0,0);
        }
    }
    printf(   "%d" ,count);
    return 0;
}

 运行结果

 

posted @   山远尽成云  阅读(1485)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示