
一、单选题 每题 2 分,共 30 分
| 1 | 答案:C GESP 一级可选语言有 Python、C++、Scratch 三种。 |
| 2 | 答案:B 闰年判定规则:能被 400 整除,或(能被 4 整除且不能被 100 整除)。即 (yr%400==0) || (yr%4==0 && yr%100!=0)。 |
| 3 | 答案:C 32 位有符号 int 的范围是 -2^31 ~ 2^31-1,即约 -21 亿 ~ 21 亿。 |
| 4 | 答案:C 十进制转八进制:每次取余 8 存数组,除以 8 继续,下标自增。应填入 oct_number[i++] = decimal % 8; decimal /= 8; |
| 5 | 答案:C 二进制 101.11 = 1x4 + 0x2 + 1x1 + 1x0.5 + 1x0.25 = 5.75。注意小数部分的位权分别是 1/2 和 1/4。 |
| 6 | 答案:D arr[1] = 2,p = 2,p + 2 = 4。注意 p 是普通 int 变量不是指针。 |
| 7 | 答案:D min() 函数必须传参数,无参调用编译报错,不会默认返回 0。A/B/C 均正确。 |
| 8 | 答案:A 2 字节 = 16 位无符号整数,范围 0 ~ 2^16-1 = 65535。注意 unsigned 没有负数。 |
| 9 | 答案:A 代码实现相邻两位交换(不用临时变量的异或技巧)。每步 i+=2,将 arr[0]&arr[1]、arr[2]&arr[3]、arr[4]&arr[5] 两两交换,结果为 {2,1,4,3,6,5}。 |
| 10 | 答案:A a=3(011), b=7(111), a&b=3(011); c=15(1111), d=4(0100), c^d=11(1011); 3|11=11(1011)。结果是十进制 11。 |
| 11 | 答案:B sizeof(arr)/sizeof(arr[0]) = 24/4 = 6,数组共 6 个元素。这是求数组长度的经典写法。 |
| 12 | 答案:B sizeof(s)=10(数组总字节),strlen(s)=5(实际字符串长度),10-5=5。注意 sizeof 计算的是数组声明时分配的空间。 |
| 13 | 答案:C 1+2+...+1000 直接用等差数列求和公式 n(n+1)/2 即可,不需要枚举。其他选项用枚举法都是合理的选择。 |
| 14 | 答案:A 枚举鸡的数量 x(0~35),兔的数量 y=35-x,验证 2x+4y==94。只需枚举 36 次,效率最高。B 中兔枚举到 94 范围太大;C 双重循环枚举 10000 次太慢。 |
| 15 | 答案:D 如果 str[i]+3 超过 'z'(122),则从 'a' 重新开始。D 的写法 a+(str[i]+3-'z')-1 正确计算了循环后的位置。注意判断条件用 str[i]+3 > 'z' 而非 str[i] > 122。 |
二、判断题 每题 2 分,共 20 分
| 16 | 正确 GESP 认证同一级别的能力与编程语言无关,不同语言考察的核心是相同的编程思维和算法能力。 |
| 17 | 正确 整数 -6 的 16 位补码:原码 1000 0000 0000 0110,反码 1111 1111 1111 1001,补码 1111 1111 1111 1010,即十六进制 FFFA。 |
| 18 | 正确 补码的核心优势就是将减法转化为加法(加上负数的补码),简化了 ALU 的硬件设计,统一了加减运算。 |
| 19 | 错误 a++ 先取值再自增,取值 5;++b 先自增再取值,取值 4;c = 5 + 4 = 9,不是 8。 |
| 20 | 错误 位运算符 & | ^ ~ 的优先级低于算术运算符 + - * /。例如 a+b&c 会先算 a+b 再 &c。 |
| 21 | 正确 int a[] = {1,2,3,4,5}; 正确定义了包含 5 个元素的整型数组,编译器自动推断数组大小。 |
| 22 | 正确 3>2 为 true,三目运算符取 arr[1] = 2,输出 2。三目运算符 a>b?x:y 等同于 if-else 的逻辑。 |
| 23 | 错误 字符 '1' 的 ASCII 码是 49,数字 1 是整数 1,两者值不相等。char 和 int 在 0-255 范围内可以类型互换但值不同。 |
| 24 | 错误 0xf0 + 0x0f = 0xff = 255,表达式 ((0xf0 + 0x0f) == 255) 本身为 true。但题目原文描述有误(说表达式少括号),根据解析判为错误。 |
| 25 | 正确 a 最低位为 0,则 a&1=0;0&3=0;((a&3&1)==0) = (0==0) = true。最低位决定奇偶性,偶数的 a&1 恒为 0。 |
三、编程题
题目 A · 苹果
给定 n 个整数,要求修改某些数,使得最终序列满足:每个数都是正整数,且后面的数严格大于前面的数。求修改后所有数之和的最小值。
参考代码:
#include<bits/stdc++.h>
using namespace std;
long long a[1005];
int main(){
int n;
long long cnt=0;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=2;i<=n;i++){
if(a[i-1]>=a[i])a[i]=a[i-1]+1;
}
for(int i=1;i<=n;i++) cnt+=a[i];
cout<<cnt;
return 0;
}
解题思路:
| 1 | 保留首元素:第一个数不用修改,直接保留原值 a[1]。因为前面没有约束条件。 |
| 2 | 贪心修正:从 i=2 开始遍历,如果 a[i] <= a[i-1](不满足严格递增),则将 a[i] 改为 a[i-1]+1。这样保证刚好大 1,总和最小。 |
| 3 | 无需修改的情况:如果 a[i] > a[i-1],说明已经满足递增条件,不做任何改动。 |
| 4 | 累加求和:最后遍历整个数组累加,即为修改后的最小总和。使用 long long 防止溢出。 |
题目 B · 趣味数字闯关:统计二进制回文数
输入一个正整数 n,统计 1~n 中有多少个整数的二进制表示是回文数(即正读反读都一样)。
参考代码:
#include <iostream>
using namespace std;
int main() {
int n, a[50] = {0}, ans = 0;
cin >> n;
for(int i = 1; i <= n; i++) {
int t = i, pos = 0;
while(t) {
a[pos++] = t % 2;
t /= 2;
}
bool ok = true;
for(int i = 0; i < pos; i++)
if(a[i] != a[pos - i - 1]) {
ok = false;
break;
}
ans += ok;
}
cout << ans;
return 0;
}
解题思路:
| 1 | 暴力枚举:从 1 到 n 逐个遍历每个整数,对每个数分别判断其二进制是否为回文。 |
| 2 | 十进制转二进制:使用短除法:不断对 2 取余存入数组 a[pos++],然后除以 2,直到 t 变为 0。数组存储的是从低位到高位的二进制位。 |
| 3 | 数组判回文:双指针法:a[i] 与 a[pos-i-1] 两两对比,如果有任何一对不相等,则不是回文。注意内层循环变量 i 与外层循环变量 i 冲突,实际代码应避免同名。 |
| 4 | 统计计数:用 ans += ok 累加满足回文条件的数的个数,最后输出 ans。时间复杂度 O(n log n)。 |
备考提示
本次三级模拟题涵盖:进制转换(二进制/八进制/十六进制)、位运算(& | ^ ~)与优先级、补码与原码、数组与 sizeof/strlen、枚举算法与贪心策略、三目运算符、字符串加密、GESP 考试常识等核心考点。建议重点掌握:二进制与十进制互转、位运算的真值表与优先级、补码的计算方法、枚举法的使用场景与效率优化。
