样题 GESP等级认证C++编程(五级)试题解析

【单选题】(每题2分)

1、以下不属于计算机输出设备的有?( )

A、麦克风    B、音箱    C、打印机    D、显示器   

正确答案:A

试题解析:麦克风是属于计算机的输入设备。

2、小明想了一个 1~100 之间的整数。你可以做多次猜测,每次猜测之后,如果你没有猜中,小明会告诉你,你猜的数比他想的数大还是小。你希望你在运气最坏的情况下花费最少的次数猜中,请问你运气最坏的情况下会猜( )次?(包括最后猜中的那次)

A、5    B、6    C、7    D、100    

正确答案:C

试题解析:根据二分查找算法的思想,为了在运气最坏的情况下最少次数猜中,我们可以每次将搜索范围缩小一半。

对于N个数字,最多的猜测次数则是LogN。

本例中,因为2的6次方是64,而2的7次方128,所以最多需要7次可以猜中。

3、关于分治算法,下列说法错误的是?( )

A、分治算法的核心思想是分而治之,即把问题转化为多个规模更小的子问题求解。    B、分治算法可以不使用递归实现。   

C、分治算法的时间复杂度是 O(logN),其中 N 表示问题的规模。    D、分治算法通常较容易在多核处理器上实现加速。   

正确答案:C

试题解析:选项A是分治算法的核心思想,是正确的。

选项B,虽然分治算法经常用递归来实现,但也可以使用迭代或循环等方式实现。

选项C,分治算法的时间复杂度通常是 O(n log n) 或者 O(n^2),这取决于具体的问题和算法设计。只有在对半分割的情况下,时间复杂度才是 O(logN)。

选项D,因为分治算法可以将问题分解为多个子问题,并行处理这些子问题,可以在多核处理器上实现加速。

4、有关下面C++代码说法错误的是?( )

#include <iostream>

using namespace std;

int factA(int n) {

    if (n <= 1)

        return 1;

    int ret = 1;

    for (int i = 2; i <= n; ++i)

        ret *= i;

    return ret;

}

int factB(int n) {

    return n == 1 ? 1 : n * factB(n - 1);

}

int main() {

    int n;

    cin >> n;

    cout << factA(n)<<' '<< factB(n) << endl;

    return 0;

}

A、factA()采用循环方式求n的阶乘,factB()采用递归方式求n的阶乘   

B、程序执行时如果输入5,能实现求其阶乘,程序输出结果为120 120    C、任何递归程序都可以使用循环改写   

D、程序执行时如果输入100,不能正确求出100的阶乘   

正确答案:C

试题解析:理论上所有递归都可以用循环解决,但是大量的递归用循环实现代码复杂度较大,且易出错。

程序执行时如果输入100,结果超过int类型的表示范围,不能正确求出100的阶乘。

5、下面C++代码意在实现字符串反序的功能。关于这段代码,以下说法正确的是?( )

#include <iostream>

#include <cstring>

using namespace std;

void printSReverse(char *sIn, int len) {

    if (len <= 1) {

        cout << sIn[0];

    } else {

        cout << sIn[0];

        printSReverse(sIn + 1, len - 1);

    }

}

int main() {

    char sIn[100] = "Hello";

    printSReverse(sIn, strlen(sIn));

    return 0;

}

A、这段代码可以正确实现字符串反序的功能,其输出为olleH   

B、这段代码不能正确实现字符串反序的功能,其输出为Hello   

C、这段代码不能正确实现字符串反序的功能,其输出为HHHHH   

D、这段代码不能正确实现字符串反序的功能,其输出为ooooo   

正确答案:B

试题解析:这段程序不能正确实现字符串反序,原因在于printSReverse()函数中的else部分程序是先打印sIn[0],再进行递归调用;

把cout<<sIn[0];这句移到printSReverse(sIn + 1, len - 1);则可以正确对字符串反序,这样递归函数返回的时候会依次打印反序的字符。

6、阅读下面C++实现的二分查找代码,下列说法中错误的是?( )

int binarySearch(int *arr, int l, int r, int x) {

    if (r >= l) {

        int mid = l + (r - l) / 2;

        if (arr[mid] == x)

            return mid;

        else if (arr[mid] > x)

            return binarySearch(arr, l, mid - 1, x);

        else

            return binarySearch(arr, mid + 1, r, x);

    } else

        return -1;

}

A、上面代码实现的二分查找,最少只需查找一次即可得到结果。   

B、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素0,则它实际被调用3次。   

C、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素3,则它实际被调用3次。   

D、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素10,则它实际被调用3次。   

正确答案:D

试题解析:选项D是错的。

因为binarySearch()中的l,r指的是数组的起始和终止下标,对于数组{2, 3, 4, 10, 12},查找元素10时:

第一次调用binarySearch时,mid=2,arr[mid]=4,比10小,继续第二次调用binarySearch(arr, 3, 4, 10),mid = l + (r - l) / 2=3,arr[mid]的值为10,已经找到元素10,返回mid;

所以实际上它被调用了2次。

7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小伙伴测评网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值