【每天例题】蓝桥杯 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个数中寻找满足条件的数,一条在日期中标记搜寻到第几位
代码(方法一)
该代码使用八个循环过于累赘,且未能得出正确答案(跑不动......)
#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;
}
代码(方法二)
#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;
}
运行结果


浙公网安备 33010602011771号