GESP三级真题汇总 – 算法与描述

2025年6月

选择题

第11题

以下程序使用枚举法(穷举法)求解满足条件的三位数,横线处应该填入的是()


for (int i=100; i<=999; i++) {
    int a = i / 100;
    // ...横线处...
    int c = i % 10;
    if (a*a + b*b == c*c) {
        count++;
    }
}
A. int b = (i / 10) / 10;
B. int b = (i / 10) % 10;
C. int b = (i % 10) / 10;
D. int b = (i % 10) % 10;

第12题

以下程序模拟了一个简单的小球反弹过程、横线处应该填入的是()


int height = 10;
int distance = 0;
for (int i=1; i<=5; i++) { //模拟5次落地
    // ...横线处...
    height /= 2;
    distance += height;
}
A. distance += height/2;
B. distance += height;
C. distance += height*2;
D. distance += height+1;

编程题

第2题

分糖果

有n位小朋友排成一队等待老师分糖果。第i位小朋友想要至少a_i颗糖果,并且分给他的糖果数量必须比分给前一位小朋友的糖果数量更多。老师想知道至少需要准备多少颗糖果才能让所有小朋友都开心。

核心思路:
这是一个典型的贪心或模拟问题。从第一个小朋友开始,依次确定给每个小朋友的糖果数。对于第i个小朋友,他得到的糖果数必须满足两个条件:1. 不少于他想要的a_i颗;2. 比第i-1个小朋友多。因此,第i个小朋友实际得到的糖果数就是 `max(a[i], a[i-1] + 1)`。

样例输入 1:
4
1 4 3 3
样例输出 1:
16
样例输入 2:
15
3 14 15 9 26 5 35 89 79 32 38 46 26 43 38
样例输出 2:
450

2025年3月

选择题

第15题

一个正整数是美丽数字当且仅当该正整数是9的倍数但不是8的倍数。下面的程序是编写计算n个正整数中美丽数字的数量,横线处应该填入的是()


for (int i=1; i<=n; i++) {
    cin >> a;
    if (______________________)
        cnt++;
}
A. if (a% 9 != 0 && a % 8 != 0)
B. if (a % 9 == 0 || a% 8 == 0)
C. if (a% 9 == 0 && a % 8 != 0)
D. if (a% 9 == 0 || a % 8 != 0)

编程题

第2题

词频统计

给定n个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写。

核心思路:
这是一个模拟结合数据结构(如`map`)的题目。遍历n个单词,将每个单词统一转换为小写形式,然后使用`map`来存储每个单词出现的次数。在遍历过程中,记录下出现次数最多的单词和其次数。

样例输入 1:
6
Apple
banana
apple
Orange
banana
apple
样例输出 1:
apple

2024年12月

选择题

第13题

兔子五元一只,鸡三元一只,小鸭子一元三只,现在你有一百元要买一百只、兔子、鸡、鸭子,问兔子、鸡、鸭子各买多少只,每种必须至少一只,下列哪个程序能实现。()。

(注:此题为经典的百钱百鸡问题,考察枚举算法的实现。)

第14题

求小于等于N的素数的方法中,有一种方法是将所有从2到它本身减1的数都除一遍,如果不能整除,就是素数。下列哪个程序,体现了这种方法()

(注:此题考察素数判定的枚举算法。)

第15题

工人工作一天,会得到一个金环作为工资报酬,某个工作需要15天完成,一条15个环的金环项链,为了严格执行每天工作结束时,完成对工人工资的结算,最少需要将金环项链剪裁成几段,每段几个金环()

A. 4段,分别是1、2,4,8
B. 15段,每段1个
C. 6段,分别是3、3、3、3、2、1
D. 9段,分别是2、2、2、2、2、2、1、1、1

编程题

第1题

数字替换

小杨有一个包含n个数字的序列A,他想将其中大于k的数字都替换为序列的最大值,将其中小于k的数字都替换为序列的最小值,请你帮他计算出替换后的序列。

核心思路:
这是一个模拟题。首先通过一次遍历找出数组中的最大值和最小值。然后再进行第二次遍历,根据题目描述的规则(大于k或小于k)对数组元素进行替换。

样例输入:
5 0
-2 -1 0 1 2
样例输出:
-2 -2 0 2 2

第2题

打印数字

小杨为数字0,1,2和3设计了一款5×5的网格表示形式。请你将给定的数字字符串转换为对应的图形表示形式。

核心思路:
这是一个典型的模拟和图形输出问题。由于每个数字的图形都是5行,可以外层循环5次,代表输出5行。内层循环遍历输入的数字字符串,根据当前是第几行和当前是什么数字,来拼接出正确的`*`和`.`组合。

样例输入:
1230
样例输出:
.***..***..***..***.
*.*.*..*..*..*.*.*.*
*.*.*.***..***.*.*.*
*.*.*.*....*...*.*.*
.***..***..***..***.

2024年9月

选择题

第11题

陈A歹种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去。请问在100天里,总共浇了多少次水()

A. 994
B. 996
C. 995
D. 945

第14题

有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是C。C说:是D。D说:C瞎说。请问谁是小偷()。

A. A
B. B
C. C
D. D

编程题

第1题

平衡序列

一个序列是平衡的当且仅当存在一个位置i,使得序列前i个数字的总和等于i+1到末尾数字的总和。请你判断序列是否是平衡的。

核心思路:
这是一个枚举题。可以先计算出整个序列的总和`sum`。然后从头开始遍历,用变量`prefix_sum`累加前缀和,在每个位置i都判断`prefix_sum * 2 == sum`是否成立。

样例输入:
3
3
1 2 3
4
2 3 1 4
5
1 2 3 4 5
样例输出:
Yes
Yes
No

第2题

回文拼接

判断一个字符串是否由两个长度至少为2的回文串前后拼接而成。

核心思路:
这是一个枚举题。可以枚举所有可能的分割点。对于每个分割点,检查它分割出的前后两个子串是否都为回文串,并且长度都满足要求。

样例输入:
4
abcd
aabbb
aaac
abcdd
样例输出:
No
Yes
No
No

2024年6月

选择题

第2题

下面流程图在yr输入2024时,可以判定yr代表闰年,并输出2月是29天,则图中菱形框中应该填入()。

(注:此题考察闰年判断算法的流程图描述。)

A. (yr%400==0) || (yr%4==0)
B. (yr%400==0) || (yr%4==0 && yr%100!=0)
C. (yr%400==0) && (yr%4==0)
D. (yr%400==0) && (yr%4==0 && yr%100!=0)

第6题

下列流程图的输出结果是()。

(注:此题为流程图形式的算法,包含两层循环,要求计算最终结果。)

A. 5
B. 10
C. 20
D. 30

判断题

第10题

把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,计算结果又等于原数…这样的数叫“雷劈数”。可以使用枚举的方法求出所有符合这样条件的四位数。()

2024年3月

判断题

第3题

下面C++代码可以计算1到100的累加和,采用的是穷举法。


int i,sum=0;
for(int i=1; i <= 100; i++)
    sum += i;
cout << sum << endl;

编程题

第1题

字母求和

对于一个小写字母,其值为字母顺序(a=1, b=2..)。对于一个大写字母,其值为ASCII码的相反数(A=-65..)。给一个字符串,计算所有字母值的总和。

核心思路:
这是一个模拟题。遍历输入的字符串,对每个字符进行判断:如果是小写字母,则`sum += ch – ‘a’ + 1`;如果是大写字母,则`sum -= ch`。

样例输入:
3
aAc
样例输出:
-61

第2题

完全平方数

给定一个序列A,他想要知道其中有多少对下标组合<i,j> (i<j),使得 A_i + A_j 是完全平方数。

核心思路:
这是一个枚举题。使用两层嵌套循环,枚举所有可能的下标对(i, j)且满足i<j。对每一对数字的和,判断其是否为完全平方数。

样例输入:
5
1 4 3 3 5
样例输出:
3

2023年12月

选择题

第4题

执行下面C++代码输出是( )。


int temp=0;
for(int i=1;i<7;i++)
{
    for(int j=1;j<5;j++)
    {
        if (i/j==2)
        {
            temp++;
        }
    }
}
cout<<temp<<endl;
A. 6
B. 5
C. 4
D. 3

编程题

第1题

小猫分鱼

海滩上一堆鱼,N只小猫来分。第k只小猫把当前剩下的鱼平均分为N份,若多了i个,则扔掉i个,拿走一份。问海滩上最少有多少鱼。

核心思路:
这是一个倒推的数学问题,也可以用枚举法解决。我们可以枚举第N只小猫拿走的鱼的数量k,从1开始递增。根据k可以倒推出第N-1只小猫分鱼前有多少条,再推出第N-2只…直到第一只。在倒推的每一步,都需要检查鱼的数量是否满足题目条件(即 `当前鱼数 * N / (N-1) + i` 是否为整数)。第一个能成功倒推回第一只小猫的k值,所对应的初始鱼数就是答案。

样例输入 1:
2
1
样例输出 1:
7
样例输入 2:
3
1
样例输出 2:
25

第2题

单位转换

小杨的作业是做单位转换,只涉及将更大的单位转换为更小的单位。请你帮忙完成单位转换的程序。

核心思路:
这是一个字符串处理和模拟题。循环N次,每次读取输入的数值x、单位1和单位2。通过if-else或map判断单位1和单位2的组合,确定换算倍率,然后计算`x * 倍率`并按格式输出。

样例输入 1:
2
1 km=?mm
1 m=?mm
样例输出 1:
1 km=1000000mm
1 m=1000mm

2023年9月

选择题

第2题

下列流程图的输出结果是?()

(注:流程图描述了一个循环:s的初始值为1, a的初始值为5。当a>=4时,执行s=s*a, a=a-1。要求最终s的输出值。)

A. 60
B. 20
C. 5
D. 1

判断题

第8题

著名的哥德巴赫猜想:任一大于2的偶数都可写成两个素数之和。我们可以通过枚举法来证明它。

编程题

第1题

小杨的储蓄

小杨共有N个储蓄罐,编号0到N-1。第i天他会向编号a_i的储蓄罐存入i元钱。过了D天后,求每个储蓄罐里有多少钱?

核心思路:
这是一个直接的模拟题。使用一个大小为N的数组,数组下标对应储蓄罐编号。循环D天,第i天时读入储蓄罐编号a_i,然后给对应数组元素加上i元即可。

样例输入 1:
2 3
0 1 0
样例输出 1:
4 2