一、单选题
1、定义字符串 string a = "Hello C++",下列选项可以获取到字符 'C' 的是( )。
A a[7]
B a[6]
C a[5]
D a[4]
解析:【喵呜刷题小喵解析】:字符串的索引是从0开始的,因此字符串"Hello C++"的索引为:
* H:0
* e:1
* l:2
* l:3
* o:4
* :5
* C:6
* +:7
* +:8
所以,要获取到字符'C',应该使用索引6,即选项D。
2、下列选项中数值与其它项不同的是( )。
A、
(1234)5
B、
(302)8
C、 (11000100)2
D、
(c2)16
解析:【喵呜刷题小喵解析】本题考察的是不同进制数的识别与转换。
首先,我们需要将各个选项中的数值转换为十进制数,然后比较其大小。
A选项:(1234)₅,五进制的1234转换为十进制是 1×5³ + 2×5² + 3×5¹ + 4×5⁰ = 394。
B选项:(302)₈,八进制的302转换为十进制是 3×8¹ + 0×8⁰ + 2×8⁻¹ = 250。
C选项:(11000100)₂,二进制的11000100转换为十进制是 1×2⁷ + 1×2⁶ + 0×2⁵ + 0×2⁴ + 0×2³ + 1×2² + 0×2¹ + 0×2⁰ = 192。
D选项:(c2)₁₆,十六进制的c2转换为十进制是 c×16¹ + 2×16⁰ = 200。
从上面的计算可以看出,只有C选项的数值与其他选项不同,因此答案是C。
3、定义变量 int i = 0, a,执行表达式 a = --i 后,i 和 a 的值分别是( )。
A、 -1、0
B、
0、-1
C、
-1、-1
D、
0、0
解析:【喵呜刷题小喵解析】首先,我们定义了两个变量:int i = 0,以及未赋值的a。接着执行了表达式a = --i。在这个表达式中,i被前置减1,即先减1再赋值,所以i的值变为-1。然后,a被赋值为i减1后的值,即a = -1。所以,i和a的值分别是-1和0。因此,正确答案是A。
4、定义数组 int a[10] = {4, 6, 1, 3, 8, 7, 2, 9, 0, 5},那么 *(a + 5) 的值是( )。
A、
7
B、 8
C、
2
D、
9
解析:【喵呜刷题小喵解析】:在C语言中,数组名实际上是指向数组第一个元素的指针。因此,`a` 是一个指向 `int a[10]` 数组第一个元素的指针。所以,`a + 5` 指向的是数组的第6个元素,即值为8的位置。因此,`*(a + 5)` 的值是8。所以正确答案是B。
5、执行以下程序,输出的结果是( )。
int func( int x, int y, int z ) { if( x == 1 || y == 1 || z == 1 ) return 1; if( x < y && x < z ) return func( x, y - 1, z ) + func( x, y, z - 1 ); if( y < x && y < z ) return func( x - 1, y, z ) + func( x, y, z - 1 ); return func( x - 1, y, z ) + func( x, y - 1, z ); } int main() { cout << func( 3, 3, 2 ); return 0; }
A 5
B 6
C 7
D 8
解析:【喵呜刷题小喵解析】:
首先,我们分析函数`func`的逻辑。
1. 如果`x`、`y`或`z`中的任何一个等于1,函数返回1。
2. 如果`x`小于`y`和`z`,则递归调用`func(x, y-1, z)`和`func(x, y, z-1)`,并将它们的结果相加。
3. 如果`y`小于`x`和`z`,则递归调用`func(x-1, y, z)`和`func(x, y, z-1)`,并将它们的结果相加。
4. 其他情况,递归调用`func(x-1, y, z)`和`func(x, y-1, z)`,并将它们的结果相加。
对于`main`函数中的调用`func(3, 3, 2)`,我们观察到:
* `x`并不等于1,也不小于`y`和`z`,因此第一个和第二个条件都不满足。
* `y`也不等于1,并且`y`并不小于`x`,因此第三个条件也不满足。
因此,我们进入第四个条件,即`y`小于`z`。在这个条件下,函数会递归调用`func(3, 2, 2)`和`func(3, 3, 1)`。
对于`func(3, 2, 2)`,`x`并不等于1,也不小于`y`和`z`,因此进入第四个条件。这会导致递归调用`func(2, 2, 2)`和`func(3, 1, 2)`。
对于`func(3, 1, 2)`,`x`等于1,因此直接返回1。
对于`func(2, 2, 2)`,`x`并不等于1,也不小于`y`和`z`,因此进入第四个条件。这会导致递归调用`func(1, 2, 2)`和`func(2, 1, 2)`。
对于`func(1, 2, 2)`和`func(2, 1, 2)`,`x`都等于1,因此都直接返回1。
最终,`func(3, 3, 2)`的结果是`func(3, 2, 2)`(即2)加上`func(3, 1, 2)`(即1),也就是3。
因此,`main`函数中的`cout`会输出3,与选项C对应。
二、实操题
6、求和
题目描述:
给定 n 个整数,请计算出所有大于等于 10 的整数之和。
例如:n = 5,5 个整数分别为 10、20、4、30、9,其中大于等于 10 的整数有 10、20、30,它们的和为 60(10 + 20 + 30)。
输入描述:
共两行
第一行输入一个整数 n(1≤n≤1000)
第二行输入 n 个整数 Pi(1≤Pi≤100),整数之间以一个空格隔开输出描述:输出一个整数,表示所有大于等于 10 的整数之和
样例输入:
5 10 20 4 30 9
样例输出:
60
参考答案:br />```#include
解析:【喵呜刷题小喵解析】
首先,我们需要读取输入的整数n,表示有n个整数需要处理。
然后,我们使用一个循环来读取n个整数,并在读取每个整数时,判断它是否大于等于10。如果是,则将其加到变量sum中。
最后,我们输出变量sum的值,即所有大于等于10的整数之和。
在这个程序中,我们使用了C语言的标准输入输出函数scanf和printf,以及控制流语句if和for。程序首先读取n的值,然后读取n个整数,并计算它们的和。最后,程序输出计算结果。
7、数位和为偶数的数
提示信息:
偶数:能被 2 整除的数。
数位和:一个整数中所有数位上的数字之和。
例如:整数 123,数位和是 6(1 + 2 + 3)。
题目描述:
给定一个整数 n,请找出 1 到 n 之间(包含 1 和 n)所有数位和为偶数的整数。
例如:n = 15,1 到 15 之间的整数为:1、2、3、4、5、6、7、8、9、10、11、12、13、14、15;数位和依次为:1、2、3、4、5、6、7、8、9、1、2、3、4、5、6;
数位和为偶数的是:2、4、6、8、11、13、15。
输入描述:
输入一个整数 n(2≤n≤1000)
输出描述:
一行输出若干个整数,表示 1 到 n 之间(包含 1 和 n)所有数位和为偶数的数,并按照从小到大的顺序依次输出,整数之间以一个空格隔开
样例输入:
15
样例输出:
2 4 6 8 11 13 15
参考答案:```2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100```
解析:【喵呜刷题小喵解析】:
根据题目描述,我们需要找出1到n之间(包含1和n)所有数位和为偶数的整数,并按照从小到大的顺序依次输出。
首先,我们需要理解什么是数位和。数位和是指一个整数中所有数位上的数字之和。例如,整数123的数位和是1+2+3=6。
然后,我们需要判断一个整数的数位和是否为偶数。如果一个整数的数位和能被2整除,那么这个数位和就是偶数。
最后,我们需要遍历1到n之间的所有整数,计算每个整数的数位和,判断数位和是否为偶数,如果是,则输出该整数。
根据题目给出的样例输入和样例输出,我们可以发现,当n=15时,1到15之间的整数为:1、2、3、4、5、6、7、8、9、10、11、12、13、14、15;数位和依次为:1、2、3、4、5、6、7、8、9、1、2、3、4、5、6;数位和为偶数的是:2、4、6、8、10、12、14。
因此,根据题目的要求,我们需要输出所有数位和为偶数的整数,并按照从小到大的顺序依次输出。根据上面的计算,当n=15时,输出的整数为:2、4、6、8、10、12、14。
对于更大的n,我们可以按照同样的方法计算数位和,并输出数位和为偶数的整数。
需要注意的是,题目中给出的n的范围是2≤n≤1000,因此我们需要遍历1到n之间的所有整数,计算每个整数的数位和,判断数位和是否为偶数,如果是,则输出该整数。由于n的范围较大,我们需要使用循环来遍历整数,并计算数位和。
在输出时,我们需要将每个数位和为偶数的整数按照从小到大的顺序依次输出,整数之间以一个空格隔开。可以使用字符串拼接的方式来实现输出。
8、填涂颜色
题目描述:
给定一个由 n 行 m 列的小方格组成的矩阵图形,接下来对该图形进行如下操作:1、先选择其中 x 行,将其填成黄色;2、再选择其中 y 列,将其填成黄色;填色完成后,请统计出有多少个小方格未被填色。
例如:矩阵图形由 4 行 5 列的小方格组成,先选择第 2、4 行将其填色,再选择第 1、3、5 列将其填色。
填色完成后,有 4 个小方格未被填色。
输入描述:共三行
第一行输入 4 个整数 n,m,x,y,分别表示矩阵的行数和列数以及选择填色的行数和列数 (1≤x≤n≤10000,1≤y≤m≤10000),整数之间以一个空格隔开
第二行输入 x 个不同的整数(1≤整数≤n),表示被填色的行号,整数之间以一个空格隔开
第三行输入 y 个不同的整数(1≤整数≤m),表示被填色的列号,整数之间以一个空格隔开
输出描述:
输出一个整数,表示填色完成后未被填色的小方格数量
样例输入:
4 5 2 3 2 4 1 3 5
样例输出:
4
参考答案:```#include
解析:【喵呜刷题小喵解析】:
这个问题可以通过遍历整个矩阵,然后检查每个方格是否被填色来解决。首先,我们需要将填色的行和列存储在unordered_set中,这样可以快速检查一个特定的行或列是否被填色。然后,我们遍历整个矩阵,对于每个方格,如果它的行和列都不在填色的集合中,那么这个方格就是未被填色的。
这个解决方案的时间复杂度是O(n*m),其中n是行数,m是列数。这是因为它需要遍历整个矩阵。空间复杂度是O(x+y),其中x是填色的行数,y是填色的列数。这是因为我们需要存储填色的行和列。
在C++中,我们可以使用unordered_set来存储填色的行和列,然后使用两个嵌套的循环来遍历整个矩阵。对于每个方格,我们检查它的行和列是否在填色的集合中,如果不在,我们就增加计数器。最后,我们返回计数器的值,即未被填色的方格数量。
9、外观数列
提示信息:
外观数列是一个整数序列,给定该数列的第一项数据之后,从第二项开始,每一项都是对前一项数据的描述。
例如:
给定外观数列的第一项为 1;
接下来第二项是对第一项数据的描述,即“一个 1”,记作 11;
第三项是对第二项数据的描述,即“两个 1”,记作 21;
第四项是对第三项数据的描述,即“一个 2,一个 1”,记作 1211;
第五项是对第四项数据的描述,即“一个 1,一个 2,两个 1”,记作 111221;以此类推......
题目描述:
给定外观数列的第一项 x 以及一个整数 n,请计算出该外观数列第 n 项的值。
例如:x = 2,n = 3,外观数列为:
2
12
1112
3112
132112
......
外观数列第 3 项为 1112。
输入描述:
输入两个整数 x(1≤x≤100)和 n(1≤n≤30)
输出描述:
输出一个整数,表示外观数列第 n 项的值
样例输入:
2 3
样例输出:
1112
参考答案:132112
解析:【喵呜刷题小喵解析】:根据题目描述,外观数列是一个整数序列,给定该数列的第一项数据之后,从第二项开始,每一项都是对前一项数据的描述。对于输入x=2,n=3,外观数列的前几项为:2,12,1112,132112。因此,外观数列第3项为132112。
10、删除数字
题目描述:
老师在黑板上写了一个不超过 500 位的正整数 n(1≤n<10500),要求同学们删除其中任意 k 个数字, 剩余数字的顺序不变,希望得到的数最大。
例如:n = 69134,k = 2,从 69134 中删除 2 个数字,将第一位 6 和第三位 1 删除,得到的新数 934 是最大的。
输入描述:
输入两个整数 n 和 k(1≤n<10500,0≤k<n的位数),整数之间以一个空格隔开
输出描述:
输出一个整数,表示删除 k 个数字后,得到的最大数
样例输入:
69134 2
样例输出:
934
参考答案:为了得到删除k个数字后的最大数,我们需要从左到右遍历数字n,对于每个位置,判断该位置的数字是否小于其右侧的数字。如果小于,说明该数字应该被删除,以保证剩余的数字组成的数最大。如果大于或等于,说明该数字应该被保留。重复这个过程,直到删除了k个数字或遍历完所有数字。最后,将剩下的数字按顺序组合起来,即可得到最大的数。
解析:【喵呜刷题小喵解析】:
这个问题可以通过贪心算法来解决。我们从左到右遍历数字n,对于每个位置,判断该位置的数字是否小于其右侧的数字。如果小于,说明该数字应该被删除,以保证剩余的数字组成的数最大。如果大于或等于,说明该数字应该被保留。这样,我们就可以保证从左到右删除的是尽可能小的数字,从而得到最大的数。重复这个过程,直到删除了k个数字或遍历完所有数字。最后,将剩下的数字按顺序组合起来,即可得到最大的数。
具体实现时,我们可以使用一个栈来保存当前应该保留的数字。从左到右遍历数字n,对于每个位置,如果该位置的数字大于栈顶的数字,就将其入栈。否则,如果栈不为空且该位置的数字小于栈顶的数字,就弹出栈顶的数字,直到该位置的数字大于栈顶的数字或栈为空。这样,栈中保存的就是应该保留的数字。最后,将栈中的数字按顺序组合起来,即可得到最大的数。
需要注意的是,当n的位数小于k时,无法删除k个数字,此时应该输出n本身。另外,当遍历完所有数字后,如果删除的数字个数小于k,说明无法删除k个数字,此时应该输出已经遍历过的数字组成的最大数。
11、小松鼠的聚会
题目描述:
在一片树林中,有 n 个树洞,按顺序从 1 到 n 编号,每个树洞里住着至少一只松鼠。一条藤蔓连接两个树洞,共有 n - 1 条藤蔓,使得任意两个树洞可以直接或间接到达。这些小松鼠经常举办聚会,当某个树洞中的小松鼠举办聚会时,它们也会邀请距离自家树洞不超过 k 条藤蔓范围的邻居们前来参加聚会。
请计算出每个树洞分别在举办聚会时,最多有多少只小松鼠参加聚会,并按照树洞编号从 1 到 n 依次输出结果。
例如:n = 4,表示有 4 个树洞,1 到 4 号树洞中居住的小松鼠的数量分别为:5、3、6、1;共有 3 条藤蔓,每条藤蔓连接两个树洞,分别为:1 和 2、1 和 3、2 和 4;k = 2,表示当某个树洞中的小松鼠举办聚会时,它们会邀请距离自家树洞不超过 2 条藤蔓范围的邻居们前来参加聚会;
根据上图得知:
当 1 号树洞的小松鼠举办聚会时,1、2、3、4 号树洞中的小松鼠可以参加,最多会有 15(5 + 3 + 6 + 1) 只小松鼠参加;
当 2 号树洞的小松鼠举办聚会时,1、2、3、4 号树洞中的小松鼠可以参加,最多会有 15(5 + 3 + 6 + 1) 只小松鼠参加;
当 3 号树洞的小松鼠举办聚会时,1、2、3 号树洞中的小松鼠可以参加,最多会有 14(5 + 3 + 6) 只小松鼠参加;
当 4 号树洞的小松鼠举办聚会时,1、2、4 号树洞中的小松鼠可以参加,最多会有 9(5 + 3 + 1) 只小松鼠参加;故答案为:
15
15
14
9
输入描述:
第一行输入一个整数 n(1≤n≤100000),表示树洞的数量
接下来 n 行,每行输入一个整数 Ci(1≤Ci≤1000),表示每个树洞中居住的小松鼠的数量
接下来 n - 1 行,每行输入两个整数 ai,bi(1≤ai,bi≤n),表示藤蔓连接两个树洞的编号,整数之间以一个空格隔开
最后一行输入一个整数 k(1≤k≤20),表示邀请邻居的距离限制
输出描述:
共 n 行,每行输出一个整数,表示每个树洞中的小松鼠在举办聚会时,参加聚会的小松鼠的最大数量,按照树洞编号从 1 到 n 依次输出结果。
样例输入:
4 5 3 6 1 1 2 1 3 2 4 2
样例输出:
15 15 14 9
参考答案:```1515149```
解析:【喵呜刷题小喵解析】:
这个问题可以使用图的深度优先搜索(DFS)来解决。首先,我们需要构建一棵森林(n棵树)的图结构,每个树洞为一个节点,藤蔓为边。然后,我们可以从每个树洞开始,进行深度优先搜索,计算每个树洞在举办聚会时,最多有多少只小松鼠参加聚会。
具体步骤如下:
1. 创建一个大小为n的数组,用于存储每个树洞举办聚会时,参加聚会的小松鼠的最大数量。
2. 遍历藤蔓,对于每条藤蔓,将两个树洞连接起来。
3. 对于每个树洞,进行深度优先搜索,计算参加聚会的小松鼠的最大数量。
4. 在深度优先搜索过程中,对于每个邻居树洞,如果它到当前树洞的距离不超过k,则将其参加聚会的小松鼠数量累加到当前树洞的数量中。
5. 遍历完所有树洞后,将结果按照树洞编号从1到n依次输出。
注意:由于n可能很大,所以需要使用数组或数据结构来存储树洞和藤蔓的信息,以避免超时或内存溢出的问题。同时,需要优化搜索算法,减少重复计算和不必要的搜索,以提高效率。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!