GESP 四级急救包(2):客观题真题集

一、选择题

1. 真题梳理

  1. 若函数声明为 void f(int &a, int b, const int &c),且在主函数内已经声明了 x , y , z x,y,z x,y,z 三个 int 类型变量。如下哪个调用可以通过编译?

    A. f(x,x,0)
    B. f(0,0,z)
    C. f(0,y,y)
    D. f(1,2,3)

  2. 下面的 C++ 代码执行后,输出的是

    int main() {
      int arr[10] = {0,1,2,3,4};
      char ovo[] = "ovo";
      cout << sizeof(ovo) << ' ' << sizeof(arr) << endl;
    }
    

    A. 3 10
    B. 4 10
    C. 3 40
    D. 4 40

  3. 下面的 C++ 代码执行后,输出的是

    int foo(char *x) {
      return 3**x*2;
    }
    
    int main() {
      char arr[10] = {char(10)};
      arr[1] = foo(arr);
      cout << int(arr[0]) * int(arr[1]) << endl;
    }
    

    A. 10
    B. 60
    C. 600
    D. 100

  4. 对三维数组 int arr[2][3][4],其占用的内存大小是 () 字节

    A. 9 9 9
    B. 24 24 24
    C. 96 96 96
    D. 144 144 144

  5. 对三维数组 int arr[2][3][4],则 arr + 1 是如下哪个数组元素的地址?

    A. arr[1][0][0]
    B. arr[0][0][1]
    C. arr[0][1][0]
    D. arr[2][3][5]

  6. 下面的 C++ 代码执行后,输出的是

    int main() {
      char *p = "I love GESP!";
      cout << *(p+5) << endl;
    }
    

    A. e
    B. ve GESP!
    C. e GESP!
    D. v

  7. 下列 C++ 代码被执行后的输出是?

    int rc = 5;
    int main() {
      int rc = 3;
      cout << ::rc++ << endl;
    }
    

    A. 3
    B. 4
    C. 5
    D. 6

  8. 已知数组 arr[10],下列语句执行时不会产生越界错误的是:

    A. false && arr[100]
    B. true && arr[10]
    C. false || arr[100]
    D. false || arr[10]

  9. 归并排序算法的空间复杂度是?

    A. Θ ( n 2 ) \Theta(n^2) Θ(n2)
    B. Θ ( n ) \Theta(n) Θ(n)
    C. Θ ( n log ⁡ n ) \Theta(n \log n) Θ(nlogn)
    D. O ( 1 ) O(1) O(1)

  10. 已知变量 x x x 的地址是 0x6ffe14,则下⾯C++代码执行以后输出的是?

    int main() {
      int x = 100;
      int *p = &x;
      cout << *p + 3 << endl;
    }
    

    A. 0x6ff17
    B. 0x6ff20
    C. 101
    D. 103

  11. 输入 Luogu A K,则下列 C++ 代码执行后的输出是( )?

    int main() {
      string s;
      char x, y;
      cin >> s >> x >> y;
      cout << s << x << y << endl;
    }
    

    A. Luo
    B. LAK
    C. Luogu A
    D. LuoguAK

  12. 下列 C++ 函数用于判定输入的数 x x x 是不是质数。则在横线上填写哪条语句可以使得函数得到正确的结果?

    bool isPrime(int x) {
      if (x == 1) return false;
      for (int i = 2; ___; ++i) if (x % i == 0) return false;
      return true;
    }
    

    A. i < x
    B. i <= x
    C. i * i == x
    D. 不填

  13. 如下 C++ 代码的时间复杂度是:

    for (int i = 1; i <= n; i *= 2) {
      for (int j = 1; j <= i; ++j) {
        cout << j << '\n';
      }
    }	
    

    A. Θ ( n log ⁡ n ) \Theta(n \log n) Θ(nlogn)
    B. Θ ( n 2 ) \Theta(n^2) Θ(n2)
    C. Θ ( n ) \Theta(n) Θ(n)
    D. O ( 1 ) O(1) O(1)

  14. 洛谷官方网站是 www.luogu.com.cn。其中 www 的含义是?( )?

    A. 局域网
    B. 万维网
    C. 广域网
    D. 洛谷子网

  15. 如下编程常用软件中,不属于集成开发环境(IDE)的是( )?

    A. Dev-C++
    B. IntelliJ IDEA
    C. visual Studio Code(VS Code)
    D. GUIDE

2. 真题答案

【答案】 A D C C A A C A B D D A C B C ADCCAACABDDACBC ADCCAACABDDACBC
【解析】

  1. 牢记函数和调用的内容:
#include <iostream>
using namespace std;

void f(int x, int &y, int *z)
{
    cout << "参数x:" << x << endl;
    cout << "参数y:" << y << endl;
    cout << "参数z:" << *z << endl;
}

int main()
{
   int a = 1, b = 2, c = 3, *p = &c;
   f(a, b, p); // f(a, b, &c)
   return 0;
}

口诀:
函数定义有细节,
调用参数要简洁。
变量定义传变量,
常量定义传常量。
定义地址传变量,
去掉引用取数值。
指针定义传地址,
加上星号来取值。

故选 A A A

  1. sizeof 用于返回指定变量或者数据类型占用的存储空间大小(以字节为单位)。在本题中,arr[] 开了 10 10 10int 空间。一个 int 变量会占 4 4 4 个字节,十个这样的变量就占了 4 × 10 = 40 4\times 10=40 4×10=40 个字节;ovo[] 并没有开大小,但是根据存储的数据我们知道,至少需要 4 4 4char 空间。一个 char 变量会占 1 1 1 个字节,四个这样的变量就占了 1 × 4 = 4 1\times 4=4 1×4=4 个字节。故选 D D D
数据类型所占空间(单位:字节)
int 4 4 4
long long 8 8 8
float 4 4 4
double 8 8 8
bool 1 1 1
char 1 1 1
  1. 这道题目虽然是 char[],但这只是为了迷惑大家,所以我们可以这么看:
int foo(int *x) {
  return 6* *x;
}

int main() {
  int x = 10;
  int y = foo(&x);
  cout << x * y << endl;
}

然后一步一步地模拟即可。顺便提醒一下,数组传入的默认都是引用,所以代码不是 foo(&arr) 哦。故选 C C C

  1. 开的空间大小是 2 × 3 × 4 = 24 2\times 3\times 4=24 2×3×4=24,一个 int 变量占 4 4 4 个字节, 24 × 4 = 96 24\times 4 = 96 24×4=96。故选 C C C
  2. arr[0] 拥有 + 1 +1 +1 的偏移量后就变成了 a r r [ 1 ] arr[1] arr[1]。故选 A A A
  3. *p 原来指向 'I',拥有 + 5 +5 +5 的偏移量后指向了 'e'。故选 A A A
  4. 全局变量可以在局部中使用 :: 来获得。故选 C C C
  5. && 运算的时候,从左到右依次判断条件的真假,一旦发现一个假就停止判断,返回假的值;在 || 运算的时候,从左到右依次判断条件的真假,一旦发现一个真就停止判断,返回真的值。故选 A A A
  6. 下面是常见的排序算法及其时间复杂度和空间复杂度的汇总:
排序算法最好时间复杂度平均时间复杂度最坏时间复杂度空间复杂度
冒泡排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
插入排序 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
归并排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n ) O(n) O(n)
快速排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n 2 ) O(n^2) O(n2) O ( l o g ( n ) ) O(log(n)) O(log(n))
堆排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) O ( 1 ) O(1) O(1)
希尔排序 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))取决于步长序列 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)
计数排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( k ) O(k) O(k)
桶排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n 2 ) O(n^2) O(n2) O ( n + k ) O(n+k) O(n+k)
基数排序 O ( n k ) O(nk) O(nk) O ( n k ) O(nk) O(nk) O ( n k ) O(nk) O(nk) O ( n + k ) O(n+k) O(n+k)

n n n:输入数组的长度
k k k:输入数据的范围
故选 B B B

  1. “加上星号来取值”。故选 D D D
  2. 模拟即可。故选 D D D
  3. 按照最普通的素数判断方式,从 2 2 2 遍历到 n − 1 n-1 n1 作因数。故选 A A A
  4. 外循环的迭代次数是 O ( log ⁡ n ) O(\log n) O(logn),内循环的迭代次数是 O ( i ) O(i) O(i),其中 i i i 是外循环迭代的当前值。因此,总的迭代次数可以表示为: ∑ i = 1 log ⁡ n i \sum_{i=1}^{\log n} i i=1logni
    通过求解上述求和,可以得到总的迭代次数是 Θ ( n ) \Theta(n) Θ(n)。其实这就是 vector 开空间的过程。故选 C C C
  5. www 是 World Wide Web(万维网)的缩写。故选 B B B
  6. vs code 只是 text editor。故选 C C C

3. 重难点点播

(1) 指针和地址

详见配套课程

#include <iostream>
using namespace std;

int main()
{
    int x = 100;
    int *p = &x; // 一个指向 x 地址的指针
    cout << "x 的地址是: " << p << endl;
    cout << "x 原来的值是: " << *p << endl; // 访问方式1
    *p = 50;
    cout << "x 现在的值是: " << x; // 访问方式2
    return 0;
}
#include <iostream>
using namespace std;

void f(int a, int &b, const int *c) // 函数定义有细节
{
    cout << a << endl;
    cout << b << endl; // 去掉引用取数值
    cout << *c // 加上星号来取值
}

int main()
{
    int x, y; // 变量定义传变量
    const int z = 100; // 常量定义传常量
    cin >> x >> y;
    int *p = &z; // 指针定义传地址
    f(x, y, p); // 调用参数要简洁
    return 0;
}

(2) 时间复杂度

时间复杂度的几个典型示例:

时间复杂度典型代码备注
O ( 1 ) O(1) O(1)for (int i = 1; i <= 1000; i++)
O ( log ⁡ n ) O(\log n) O(logn)for (int i = 1; i <= n; i *= 2)相当于 O ( log ⁡ 2 n ) O(\log 2^n) O(log2n)
O ( n ) O(\sqrt n) O(n )for (int i = 1; i * i <= n; i++)也能是 i <= sqrt(n)
O ( n ) O(n) O(n)for (int i = 1; i <= n; i++)
O ( n 2 ) O(n^2) O(n2)for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
O ( n ! ) O(n!) O(n!)for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)

二、判断题

1. 真题梳理

  1. 可以通过构造特殊数据使得 C++ 的 sort 函数在给 1 0 5 10^5 105int 范围内的整数排序时的用时超过一秒(在现代常用计算机上)。
  2. 在 Windows 系统下,用命令行对程序进行输入时,可以同时按下 ctrl 和 Z 键给程序输入一个输入结束符(EOF)。
  3. Windows 系统下,使用如下命令编译程序:g++ -o b a.cpp,则程序可使用的栈空间大约是 1024   MiB 1024~\texttt{MiB} 1024 MiB
  4. 在 C++ 中,有符号整型的溢出是未定义行为(UB),而无符号整型的溢出不是未定义行为。
  5. C++ 中,对于已定义的数组 int a[2][5],可以通过访问 a[1][-1] 来访问 a[0][4]
  6. 在 C++ 语言中,函数指针可以作为函数的参数被传递到另一个函数里。
  7. 可以使用 a^=b^=a^=b 来交换两个 float 类型变量的数值。
  8. 语句 a / b == c / d 的计算涉及两次除法比较慢,为了加速可以对两个分式进行通分,计算 a * d == b * c 的值。当 b b b d d d 不为 0 0 0 时,这两种计算方法得到的值总是相同的。
  9. 使用 64 位系统编译 C++ 代码得到的 64 位可执行程序里,一个指针所占的空间恒定为 8 8 8 字节。
  10. Linux 操作系统内核是用 C++ 语言编写的。
  11. 求解一个正整数 x x x 的算术平方根,可以使用枚举法完成。
  12. 在 C++ 语言中,逻辑表达式 (0x3f == 63) 的结果为 false
  13. 执行下列 C++ 代码,输出为 GES123P
string s = "GESP";
s.insert(2, "123");
cout << s << endl;
  1. 执行下列 C++ 代码,输出为 2 2 2
string s = "Luogu GESP Simulation Test";
int x = s.rfind("o");
cout << x << endl;
  1. 执行下列 C++ 代码,输出为一个负数。
char s1[]="Luogu";
char s2[]="Vijos";
cout << strcmp(s1,s2) << endl;
  1. ( 629 ) 16 + ( 2024 ) 8 (629)_{16}+(2024)_8 (629)16+(2024)8 的结果,可以表示为 16 16 16 进制下的 A 3 D A3D A3D,也可以表示为二进制下的 1010   0110   1101 1010\ 0110\ 1101 1010 0110 1101

  2. 假设有四个变量 A,B,C,D,其中 A = B = 1C = D = 0,则表达式 (A & (B | C | D) | D) 的结果为 1 1 1

  3. 执行下列 C++ 代码,输出中不含有整数 3 3 3

int a[1000];
for (int i = 0; i < 1000; i++)
    a[i] = i + 1;
for (int i = 0; i < 1000; i++)
    cout << (a[i] * a[i]) % 10 << " ";
  1. 一个正整数使用二进制表示需要 200 200 200 位,则其使用十六进制表示,需要至少 25 25 25 位。

  2. 执行下列 C++ 代码,则输出的结果为 20 20 20

    int a[10], b[10];
    a[1] = 1; a[2] = 1;
    b[1] = 1; b[2] = 2;
    for (int i = 3; i <= 6; i++) {
        a[i] = a[i - 1] + a[i - 2];
        b[i] = b[i - 1] + a[i];
    }
    cout << b[6] << endl;
    

2. 真题答案

【答案】 F T F T T T F F T F T F F F T F T T F T FTFTTTFFT FTFFFTFTTFT FTFTTTFFTFTFFFTFTTFT
【解析】

  1. 至少要 1 0 7 10^7 107int 类型的相同数据才有可能超过一秒。
  2. 这个很多同学都没有接触过,一定要记住。
  3. 一般默认的是 1 M B 1MB 1MB
  4. 在C++中,有符号整型的溢出被定义为未定义行为(Undefined Behavior)。这意味着当有符号整型的值超过了它所能表示的范围时,它的行为是不确定的。
  5. 二维数组的空间是一维的,即如果有二维数组 a[n][m],则空间有一维数组 b[n*m]
  6. 略。
  7. float 类型不能异或。牢记下表:
数据类型异或取反左移右移
int✔️✔️✔️✔️✔️✔️
long long✔️✔️✔️✔️✔️✔️
float
double
bool✔️✔️✔️

说明:

  • intlong long 类型支持与、或、异或、取反、左移、右移等位运算。
  • floatdouble 类型不支持位运算,因为它们是浮点数类型,不是整数类型。
  • bool 类型仅支持与、或、异或位运算,不支持取反和位移运算。
  1. 没有考虑非整除的情况。

  2. 略。

  3. Linux 操作系统主要是由 C C C 语言编写的。

  4. 一个数字的算术平方根可能是无理数,没办法枚举所有的无理数。

  5. 0 x 3 f ( 16 ) = 6 3 ( 10 ) 0x3f_{(16)}=63_{(10)} 0x3f(16)=63(10),所以逻辑表达式 (0x3f == 63) 的结果是 true

  6. 如果在开头插入,下标是 0 0 0。所以应该是 GE123SP

  7. rfind() 从末尾开始遍历寻找。

  8. "Luogu" 在字典序上小于 "Vijos",所以返回一个负数。

  9. 二进制是 101000111101 101000111101 101000111101

  10. 代入, ( 1 & 1 ∣ 0 ) = ( 1 ∣ 0 ) = 1 (1\&1|0)=(1|0)=1 (1&1∣0)=(1∣0)=1。牢记:
    () > ! > 算术运算符 > 关系运算符 > 逻辑运算符
    算术运算符: + , − , × , ÷ +,-,\times,\div +,,×,÷
    关系运算符: < , > , ≤ , ≥ , = = , ≠ <,>,\le,\ge,==,\ne <,>,,,==,=
    逻辑运算符: & & , ∣ ∣ \&\&,|| &&,∣∣(逻辑与的优先级大于逻辑或的优先级)

  11. 没有一个数字平方的个位数是 3 3 3

  12. 四位二进制数可以对应一个十六进制数,所以二进制 200 200 200 位可以对应 50 50 50 位的十六进制数。

  13. 模拟即可:

执行所在行 i i ia[]b[]
1/[][]
2/[1,1][]
3/[1,1][1,2]
53[1,1,2][1,2]
63[1,1,2][1,2,4]
54[1,1,2,3][1,2,4]
64[1,1,2,3][1,2,4,7]
55[1,1,2,3,5][1,2,4,7]
65[1,1,2,3,5][1,2,4,7,12]
56[1,1,2,3,5,8][1,2,4,7,12]
66[1,1,2,3,5,8][1,2,4,7,12,20]
  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值