蓝桥杯模拟

【问题描述】

如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。

请问 2024 有多少个质因数。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

3

【问题描述】

对于一个整数 n ,我们定义一次开根变换会将 n 变为开根号后的整数部分。即变为平方和不超过 n 的数中的最大数。

例如,20 经过开根变换将变为 4 ,如果再经过一次开根变换将变为 2 ,如果再经过一次开根变换将变为 1 。

请问,2024经过多少次开根变换后会变为 1 ?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

  • 答案 4

【问题描述】

小蓝有很多 1x1x1 的小立方体,他可以使用多个立方体拼成更大的立方体。

例如,小蓝可以使用 8 个小立方体拼成一个大立方体,每边都是 2 个。

又如,小蓝可以使用 27 个小立方体拼成一个大立方体,每边都是 3 个。

现在,小蓝有 2024 个小立方体,他想再购买一些小立方体,用于拼一个超大的立方体,要求所有的小立方体都用上,拼成的大立方体每边长度都相等。

请问,小蓝最少需要购买多少个小立方体?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

173

如果一个日期的日期以 1 结尾(1日、11日、21日、31日)且为星期一,则称这个日期为一好日期。

请问从 1901 年 1 月 1 日至 2024 年 12 月 31 日总共有多少个一好日期。

提示:1901 年 1 月 1 日是星期二。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

  • 答案 762

填空题

【问题描述】

两个数按位异或是指将这两个数转换成二进制后,最低位与最低位异或作为结果的最低位,次低位与次低位异或作为结果的次低位,以此类推。

例如,3 与 5 按位异或值为 6 。

小蓝有以下 30 个整数:

9226, 4690, 4873, 1285, 4624, 1596, 6982, 590, 8806, 121, 8399, 8526, 5426, 64, 9655, 7705, 3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325, 1226, 8203, 9524, 3648, 5278, 8647.

小蓝想找一个整数 V ,使得 V 与这 30 个数分别异或后,得到的 30 个数的平方和最小。请问平方和最小是多少?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

  • 答案 1070293541

【问题描述】

小蓝在一个停车场停车。

停车场的收费规则为:每 15 分钟收费 2 元,不满 15 分钟的不收费。

小蓝总共停车 n 分钟,请问收费总额是多少?

【输入格式】

输入一行包含一个整数 n ,表示小蓝停车的时长。

【输出格式】

输出一行包含一个整数,表示停车费用。

【样例输入】

150

【样例输出】

20

#include <stdio.h>

#include <stdlib.h>

int main(){

int i = 0 ;

int a = 0; //时间

int sum = 0 ; //收费

scanf("%d",&a);//获取收入的时间

if(a>=15){

i= a/15; //获取单位时间

sum = 2*i;

printf("%d",sum);

}else{

sum = 0;

printf("%d",sum);

}

return 0 ;

}

【问题描述】

小蓝有一个整数 n ,每次操作,可以将这个整数的每个非零数位减少 1 。

请问经过多少次操作,这个数会变为 0 。

例如,整数 2024 经过一次操作变为 1013,再经过一次操作变为 2 (即0002),再经过两次操作变为 0 ,总共经过 4 次变换变为 0 。

【输入格式】

输入一行包含一个整数 n 。

【输出格式】

输出一行,包含一个整数,表示答案。

【样例输入】

2024

【样例输出】

4

#include <stdlib.h>

#include <stdio.h>

int main(){

int a1 = 0,a2 = 0,a3 = 0,a4 = 0;//取千位,百位,十位,个位

int b1 = 0;//获取输入的值

int n = 0;//记录变换多少次

scanf("%d",&b1);

while(b1!=0){

a1=b1/1000;

a2=((b1/100)%10);

a3=((b1%100)/10);

a4=b1%10;

//取千位

if(a1>0){

a1 = a1-1;

}

if(a2>0){ //百位

a2 = a2-1;

}

if(a3>0){ //十位

a3 = a3-1;

}

if(a4>0){ //个位

a4 = a4-1;

}

//判断是否跳出循环

b1 = (a1*1000)+(a2*100)+(a3*10)+a4;

n++;

}

printf("%d",n);

return 0;

}

小蓝有一个减法式子,形如 a-b,其中 a 和 b 都是非负整数(不保证结果非负)。

请编程处理这个式子,输出运算结果。

【输入格式】

输入一行包含一个减法表达式,式子中仅含数字字符和一个减号。

【输出格式】

输出一行包含一个整数,表示运算结果。

【样例输入】

2024-1949

【样例输出】

75

【样例输入】

20-24

【样例输出】

-4

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

int main() {

char expression[100]; // 存放输入的字符串

scanf("%s", expression);

// 找到减号的位置

char *minusSign = strchr(expression, '-');

if (minusSign == NULL) {

printf("输入错误\n");

return 1;

}

// 将减号前后的字符串转换为整数

char *aStr = expression;

char *bStr = minusSign + 1;

int a = atoi(aStr);

int b = atoi(bStr);

// 计算减法结果

int result = a - b;

// 输出结果

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

return 0;

}

【问题描述】

小蓝有一个长度为 n 的整数数列 a[1], a[2], ..., a[n] 。

对于一个给点的整数 k ,小蓝想找到相邻间隔为 1 的 k 个数 a[p], a[p+2], a[p+4], ..., a[p+2k-2],使得他们的和最大。其中 1 <= p <= n-2k+2。

给定数列和 k ,请问给出最大的和。

【输入格式】

输入的第一行包含一个整数 n 。

第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。

第三行包含一个整数 k 。

【输出格式】

输出一行,包含一个整数,表示答案。

【样例输入】

10
2 1 4 7 4 8 3 6 4 7
2

【样例输出】

15

【样例说明】

取 p=4,a[4]+a[6]=7+8=15 最大。

#include <stdio.h>

#include <stdlib.h>

// 计算给定数列中满足条件的相邻间隔为1的k个数的最大和

int maxsum(int *a, int n, int k) {

int maxsumvalue = 0;

int currentsum = 0;

// 计算初始窗口内元素的和

for (int i = 0; i < 2 * k - 1; i += 2) {

currentsum += a[i];

}

maxsumvalue = currentsum;

// 更新最大和

for (int p = 1; p < n - 2 * k + 2; p++) {

currentsum = currentsum - a[p - 1] + a[p + 2 * k - 2];

if (currentsum > maxsumvalue) {

maxsumvalue = currentsum;

}

}

return maxsumvalue;

}

int main() {

int n, k;

// 获取数列长度n

scanf("%d", &n);

// 获取k值

scanf("%d", &k);

// 动态分配数组内存以存储数列

int *a = (int *)malloc(n * sizeof(int));

if (a == NULL) {

return 1;

}

// 获取数列的元素

for (int i = 0; i < n; i++) {

scanf("%d", &a[i]);

}

// 计算并输出最大和

int result = maxsum(a, n, k);

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

// 释放动态分配的内存

free(a);

return 0;

}

【问题描述】

小蓝有一个长度为 n 的整数序列 a[1], a[2], ..., a[n] 。

他希望从中找出一个最长的子序列,形成一个勾的形状(√)。

即找到 1 <= p[1] < p[2] < ... < p[k] <= n,满足 a[p[1]] > a[p[2]] > a[p[3]] > ... > a[p[x]] < a[p[x+1]] < ... < a[p[k]] 。其中 k 是子序列的长度,x 是勾中最小的位置。目标是使得 k 最大。

请找出最大的勾的长度。

【输入格式】

输入的第一行包含一个整数 n 。

第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。

【输出格式】

输出一行,包含一个整数,表示答案。

【样例输入】

10
2 1 4 7 4 8 3 6 4 7

【样例输出】

5

【样例说明】

当 p = (4,5,7,9,10) 时,a[4] , a[5] , a[7] , a[9] , a[10] 可形成一个长度为 5 的勾:7,4,3,6,7。

#include <stdio.h>

#include <limits.h>

int main() {

int n;

scanf("%d", &n);

int a[n];

for (int i = 0; i < n; i++) {

scanf("%d", &a[i]);

}

// 计算以每个位置为结尾的最长上升子序列长度

int lis[n];

for (int i = 0; i < n; i++) {

lis[i] = 1;

for (int j = 0; j < i; j++) {

if (a[j] < a[i]) {

lis[i] = lis[i] > lis[j] + 1 ? lis[i] : lis[j] + 1;

}

}

}

// 计算以每个位置为起始的最长下降子序列长度(注意这里是从右到左遍历)

int lds[n];

for (int i = n - 1; i >= 0; i--) {

lds[i] = 1;

for (int j = n - 1; j > i; j--) {

if (a[j] < a[i]) {

lds[i] = lds[i] > lds[j] + 1 ? lds[i] : lds[j] + 1;

}

}

}

// 找到最长的"勾"

int maxHookLength = 0;

for (int i = 1; i < n - 1; i++) { // 注意从1开始到n-2结束,因为我们需要有足够的空间来形成"勾"

int hookLength = lis[i] + lds[i] - 1; // 减去1是因为i被重复计算了

if (hookLength > maxHookLength) {

maxHookLength = hookLength;

}

}

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

return 0;

}