【问题描述】
如果一个数 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;
}