已知小写字母 b 的 ASCII 码为 ,下列 C++ 代码的输出结果是( )。
01#include <iostream> 02using namespace std; 03int main() { 04 char a = 'b'; 05 cout << a + 1; 06 return 0; 07}
D:表达式 a+1 中 char 自动提升为 int,98+1=99,cout 按整数输出 99;若输出 a 本身才是字符 c,故选 D。
已知 a 为 int 类型变量,p 为 int * 类型变量,下列赋值语句不符合语法的是( )。
A:+a 是一元正号表达式,其结果是右值,不能作为赋值运算符的左值,故 +a = *p 语法错误;B、C、D 三条赋值语句均合法,故选 A。
已知数组 a 的定义 int a[10] = {0};,下列说法不正确的是( )。
A:a[-1]=0 是对数组 a 的下标越界访问,编译期不会报错,运行期属于未定义行为(可能崩溃或破坏数据);B、C、D 的说法均正确。
下列关于 C++ 类的说法,错误的是( )。
C:静态方法属于类、不属于某个对象,但仍可用 对象.方法() 的形式调用(只是推荐用 类名::方法());C 说不能这样调用,错误。
下列关于有向图的说法,错误的是( )。
C:n 个顶点的有向图最多 n(n−1) 条边的说法默认简单图;未限定简单图时允许多重边可超过该上限,故 C 错,有向完全图 D 才是 n(n−1)。
一棵二叉树的每个结点均满足:结点的左子树和右子树,要么同时存在,要么同时不存在。该树有 个结点,则其叶结点有多少个?( )
B:该树每个结点要么无孩子、要么恰有两个孩子,属于满二叉树;n=197 时由 n=2L−1 得叶结点数 L=(197+1)/2=99。
下列关于二叉树的说法,错误的是( )。
B:n 个元素的二叉排序树高度不固定:按有序序列插入会退化成链,高度可达 n,并非一定为 ⌊log₂n⌋;A、C、D 均正确,故选 B。
一个简单无向图有 个结点、 条边。在最差情况,至少增加多少条边可以使其连通?( )
C:最差情况 6 条边全在 4 个顶点内(K₄),其余 6 个顶点孤立,共 7 个连通块;使 10 个顶点连通需再连 7−1=6 条边。
一个哈希表,包括 个位置(分别编号 ),每个位置最多仅能存储一个元素。该哈希表只有插入元素和查询两种操作,没有删除或修改元素的操作。以下说法错误的是( )。
D:若查询时哈希函数对应位置为空位,说明该元素从未被插入,不可能出现在表中(插入会把元素放在该位置或其探测空位),D 错误。故 D 错误。
以下关于动态规划的说法中,错误的是( )。
D:递推实现可能计算全部状态,记忆化递归只算需要的状态,前者复杂度可能更高;说递推总是不低于递归没有依据,D 错误,A、B、C 均正确。
下面程序的输出为( )。
01#include <iostream> 02#include <cmath> 03using namespace std; 04int main() { 05 cout << (int)exp(2) << endl; 06 return 0; 07}
B:exp(2) 即 e 的 2 次方,e²≈7.389,介于 7 与 8 之间;(int) 强制类型转换截断小数部分取整为 7,而非四舍五入得 8。
下面程序的输出及其时间复杂度:
01#include <iostream> 02#define N 10 03using namespace std; 04int h[N]; 05int main() { 06 h[0] = h[1] = 1; 07 for (int n = 2; n < N; n++) 08 for (int j = 0; j < n; j++) 09 h[n] += h[j] * h[n - j - 1]; 10 cout << h[6] << endl; 11 return 0; 12}
下面程序的输出为( )。
(2 分)该程序的时间复杂度为( )。
(2 分)下面 init_sieve 函数的时间复杂度为( )。
01int sieve[MAX_N]; 02void init_sieve(int n) { 03 for (int i = 1; i <= n; i++) 04 sieve[i] = i; 05 for (int i = 2; i <= n; i++) 06 for (int j = i; j <= n; j += i) 07 sieve[j]--; 08}
B:内层循环 j 以 i 为步长,总执行次数 n/2+n/3+…+n/n≈n·ln n,即调和级数,复杂度 O(n log n),故选 B。
下列选项中,哪个不可能是下图的深度优先遍历序列( )。
A:DFS 走到 8 后应继续沿边深入其未访问邻点 9,A 却跳到 6,违反能走就走的原则,故 A 不可能是该图的 DFS 序列,故选 A。
表达式 5 ^ 3 的结果为 。
错。^ 是按位异或:5^3 = 101₂ XOR 011₂ = 110₂ = 6,不是 125;乘方应使用 pow 函数。故错,故错。
在 C++ 语言中,函数定义和函数调用可以不在同一个文件内。
对。函数可以先只写函数原型(声明)放在头文件,再在另一个源文件里定义;调用处只要包含声明即可,故定义与调用可以不在同一文件。故对,故对。
在 个元素中进行二分查找,平均时间复杂度是 ,但须要事先进行排序。
对。二分查找要求序列有序:每次比较中间元素并把区间缩小一半,平均时间复杂度 O(log n);对无序数组需先排序才能二分。故对,故对。
unsigned long long 类型是 C++ 语言中表达范围最大的非负整数类型之一,其表达范围是 。超出该范围的非负整数运算,将无法使用 C++ 语言进行计算。
错。超出 unsigned long long 范围的非负整数仍可用高精度算法(数组/字符串模拟)计算,并非无法用 C++ 计算,可用高精度解决。
使用 math.h 或 cmath 头文件中的函数,表达式 log2(32) 的结果为 、类型为 int 。
错。log2(32) 返回 double 类型(值为 5.0),不是 int;整型转浮点是隐式转换,但结果类型是 double,故错。
C++ 是一种面向对象编程语言,C 则不是。继承是面向对象三大特性之一。因此,使用 C 语言无法实现继承。
对。C++ 支持类与继承,是面向对象语言;C 语言没有类、继承语法,无法原生实现继承(只能靠结构体加函数指针模拟),说法正确,故对。
邻接表和邻接矩阵都是图的存储形式。邻接表在遍历单个顶点的所有边时,时间复杂度更低;邻接矩阵在判断两个顶点之间是否有边时,时间复杂度更低。
A:正确。CCF 官方答案判正确。邻接表遍历单点所有边对出边 O(deg(u)) 比邻接矩阵扫描 O(V) 更低;邻接矩阵判两点是否有边 O(1) 比邻接表扫描 O(deg(u)) 更低;两个比较均成立。
MD5 是一种常见的哈希函数,可以由任意长度的数据生成 位的哈希值,曾广泛应用于数据完整性校验。中国科学家的系列工作首次发现了可实用的 MD5 破解方法。之后,MD5 逐渐被其他哈希函数所取代。
对。MD5 由任意长度数据生成 128 位哈希值,中国学者王小云团队首次给出可实用的碰撞破解方法,之后逐渐被更安全的哈希取代,史实正确。
递归调用在运行时会由于层数过多导致程序崩溃,可以通过循环配合栈缓解这一问题。
对。递归层数过深会耗尽系统调用栈导致程序崩溃;改用显式栈加循环来模拟递归过程,可把栈放到堆上(空间更大),避免栈溢出,做法可行,故对。
一个图中,每个顶点表达一个城市,连接两个顶点的边表达从一个城市到达另一个城市的一种交通方式。这个图可以用来表达交通网络,且是简单有向图。
错。城际交通可能双向通行、多方式并线,抽象后不一定是简单有向图;且简单图丢失了距离、容量等信息,不足以完整表达交通网络。故说法错误。