【每天例题】蓝桥杯 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; } |
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现