蓝桥杯题目
题目风格大致分为两类
- 数学
- 算法 -> 程序
题目设置
十道题
填空题两道,5分
程序设计题两道,10分
程序设计题两道,15分
程序设计题两道,20分
程序设计题两道,25分
试题A
- 这是一道结果填空题,只需要写结果就行
- 如出现时间限制,内存限制,为程序设计题,需要写程序
- 思路分析
- 先从数组首位开始依次找,直到依次找出2023,然后在2023的最后的3之前的数组的内容就不需要计入统计了,直接从3之后的内容开始纳入统计,计算出适合月份和天数的情况(1.1——12.31)包含有多少种。
- 先完成一趟的情况,再往里面套(数九、素数、冒泡、排序)
- 结果是235
注意 - 只需要讨论不同的情况
程序
- 填空题三步
- 运算/程序
- 填空题超过3分钟计算不出来,循环超过3层,或超过30次,考虑用程序
- 数据存储
- 数据结构 -> 数组
只需要存放2023中的3之后的内容
- 数据结构 -> 数组
- 程序设计
- 算法思想 -> 穷举法
- 通过分析,月份的十位要不是0要不是1
代码示范1
- 通过分析,月份的十位要不是0要不是1
- 算法思想 -> 穷举法
/*日期统计 - 纯C */
#include <stdio.h>
#define N 41
// 判断日期是否存在
int isExist(int buff2[], int date)
{
for(int i = 0; i < 366; i++)
{
if(buff2[i] == date)
return 1;
}
return 0;
}
int main()
{
int cnt = 0; //设置计数器
int buff2[366] = {0}; // 存放日期
int buff[N] = { 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 };
//将需要的数据存放在数组中
for(int y1 = 0; y1 < N; y1++) //遍历数组中的数据,确定月份第一个数
{
if(buff[y1] == 0 || buff[y1] == 1) //如果第一个数为0/1,进入内循环
{
for(int y2 = y1+1; y2 < N; y2++) //从下一个开始遍历第二个数,月份的第二位
{
int yue = buff[y1]*10 + buff[y2]; //计算月份
if(yue >= 1 && yue <= 12) //月份大于0,小于13
{
for(int d1 = y2+1; d1 < N; d1++) //往后遍历日期的第一位
{
for(int d2 = d1+1; d2 < N; d2++) //往后遍历日期的第二位
{
int day = buff[d1]*10 + buff[d2]; //计算日期
int date = yue*100 + day; //计算总日期
if((yue == 2) && (day >=1 && day <= 28)) //如果月份等于2的话,日期大于1小于28,2023不是闰年
{
if(isExist(buff2, date) == 0)
{
buff2[cnt++] = date; //满足条件,将日期存入数组
}
}else if(((yue == 1) || (yue == 3) ||(yue == 5)
|| (yue == 7) || (yue == 8) || (yue == 10)
|| (yue == 12)) && (day >=1 && day <= 31)) //如果月份是135781012,日期大于1小于31
{
if(isExist(buff2, date) == 0)
{
buff2[cnt++] = date; //满足条件,将日期存入数组
}
}else if(((yue == 4) || (yue == 6) ||(yue == 9)
|| (yue == 11)) && (day >=1 && day <= 30)) //如果月份是46911,日期大于1小于30
{
if(isExist(buff2, date) == 0)
{
buff2[cnt++] = date; //满足条件,将日期存入数组
}
}
}
}
}
}
}
}
printf("%d\n", cnt); //输出个数
return 0;
}
代码示范2
- 混入C++代码
/*日期统计 - C/C++混编 */
#include <stdio.h> // 包含标准输入输出库
#include <iostream> // 包含C++输入输出流库
#include <set> // 包含C++标准库中的set容器,用于存储唯一的日期 using namespace std; // 使用C++标准库的命名空间
#define N 41 // 定义常量N为41,表示缓冲区的大小
int main()
{
set<int> dates; // 声明一个set容器,用于存储唯一的日期
int buff[N] = {
// 声明并初始化一个大小为N的整型数组,存储日期的数字表示
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 };
// 遍历日期数组,寻找有效日期
for(int y1 = 0; y1 < N; y1++)
{
// 如果日期的十位或个位为0或1,则可能为月份的十位或个位
if(buff[y1] == 0 || buff[y1] == 1)
{
// 遍历寻找可能的月份的个位
for(int y2 = y1 + 1; y2 < N; y2++)
{
int yue = buff[y1] * 10 + buff[y2]; // 计算月份
// 如果月份有效
if(yue >= 1 && yue <= 12)
{
// 遍历寻找可能的日期的十位和个位
for(int d1 = y2 + 1; d1 < N; d1++)
{
for(int d2 = d1 + 1; d2 < N; d2++)
{
int day = buff[d1] * 10 + buff[d2];
// 计算日期
int date = yue * 100 + day;
//将月份和日期组合成一个整数表示的日期
// 判断日期是否合法并添加到set容器中
if((yue == 2) && (day >= 1 && day <= 28))
{
dates.insert(date);
}
else if(((yue == 1) || (yue == 3) || (yue == 5)
|| (yue == 7) || (yue == 8) || (yue == 10)
|| (yue == 12)) && (day >= 1 && day <= 31))
{
dates.insert(date);
}
else if(((yue == 4) || (yue == 6) || (yue == 9)
|| (yue == 11)) && (day >= 1 && day <= 30))
{
dates.insert(date);
}
}
}
}
}
}
}
printf("%d\n", dates.size()); // 打印set容器中日期的数量
return 0;
}