参考答案

B D C D B

D D B A C

D C D B C

A B B B C

A B B B B

D C B B A

B B D A D

D D D D A

B B C

单选题

1.关于C++语言描述错误的是?

[A]C++是面向对象编程的语言

[B]C++源代码在Linux环境中可以直接执行

[C]C++程序可以直接导入C语言的常用头文件且不会出现错误

[D]导入对应头文件后可以使用C++程序调用windows系统命令

解析过程
  • [A] C++是面向对象编程语言,具有类、继承、多态等面向对象特性,该描述正确。
  • [B] C++源代码需要先通过编译器(如g++)编译生成可执行文件,之后才能在Linux环境中运行,不能直接执行,该描述错误。
  • [C] C++兼容C语言,其标准库包含C语言的常用头文件(如stdio.h、stdlib.h等),直接导入后可正常使用,不会出现错误,该描述正确。
  • [D] 在Windows环境下,通过导入特定头文件(如windows.h),C++程序可以调用Windows系统API函数来执行系统命令,该描述正确。

2.二进制数10101110 和 11110110 做逻辑异或运算的结果是( )。

[A]11111111

[B]10100110

[C]01011000

[D]01011010

解析过程

异或运算规则是相同则0,不同则1。

因此过程如下: 101011101111011001011000\cfrac{10101110}{\cfrac{11110110}{01011000}}

3.一个8位二进制数,其原码为10010101,则其补码是( )

[A]10010101

[B]01101010

[C]11101011

[D]11101010

解析过程

原:二进制+符号位1

反:除符号位反转(0,1互换)

补:反码+1(进位)

程序题

1.

#include<iostream>
using namespace std;
int count=0, weight[1001], a[7];
int main() {
    for(int i=1;i<=6;i++){
         cin>>a[i];
    }
    for (int x1=0; x1<=a[1]; x1++)
        for (int x2=0; x2<=a[2]; x2++)
            for (int x3=0; x3<=a[3]; x3++)
                for (int x4=0; x4<=a[4]; x4++)
                    for (int x5=0; x5<=a[5]; x5++)
                        for (int x6=0; x6<a[6]+1; x6++)
                        {
                            int w=1*x1+2*x2+5*x3+10*x4+20*x5+50*x6;
                            weight[w]++;
                        }
    for (int i=0; i<=1000; i++)
        if (weight[i]>0) count++;
    cout<<count;
    return 0;
}
  • 任意满足要求的合法输入,程序运行中均不会发生运行错误。(若会发生运行错误,则认为之后问题描述的程序是修正后的数据范围)。

[A]√

[B]×

对于“任意合法输入程序运行无错误”这一说法,由于weight数组大小为1001(索引0-1000),只要输入的a[1]到a[6]使得计算出的w不超过1000,就不会越界。题目已说明“任意合法输入均无运行错误”(但是时我没看懂...),因此该说法正确,答案为A。
  • 若程序执行完毕后,输出结果至少为1。

[A]√

[B]×

程序逻辑中,六重循环从x1(对应a[1])开始嵌套执行。若任意a[i]=0(如a[1]=0),则该层循环条件x_i<0不成立,循环体完全不会执行‌,导致weight数组无任何赋值(全为0),最终count=0。

  • 当程序输入为”0 0 0 1 1 1”时,程序输出为( )。

[A]6

[B]7

[C]8

[D]9

2.

#include<iostream>
using namespace std;
int n;
char s[4096]; 
int fun(int start, int length)
{
    if(length == 0){
        cout << (s[start]=='0'?'A':'B');
        return s[start] - '0';
    }
    int p = 1<<(length-1);
    int l = fun(start,length-1);
    int r = fun(start+p,length-1);
    if( l==r && l!=2 )
    {
        cout << (l==0?'A':'B');
        return l;
    }
    else{
        cout<<'C';
        return 2;
    }
}
int main()
{
    cin >> n;
    cin >> s;
    fun (0, n);
    return 0;
}
  • 存在某种合法输入,使得程序输出为连续的多个ABC依次循环( )

[A]√

[B]×

递归函数中输出“C”需左右子树返回值不同,而“A/B”需返回值相同或为叶节点输出,循环序列“ABC”需固定模式交替,但函数输出受输入和递归结构约束,无法形成规律性“ABC”重复。
  • 存在某种合法输入,使得程序输出全部为C字符( )

[A]√

[B]×

叶节点总是输出“A”或“B”,无法输出“C”;非叶节点输出“C”需左右子树返回值不同,但叶节点输出必然包含“A/B”,导致全部输出为“C”不可行。
  • 当n的值为3时,输出字符A的个数最多为( )

[A]3

[B]6

[C]8

[D]15

填空题

题目描述

选择不相交区间 数轴上有n个开区间(ai,bi)。选择尽量多的区间,使这些区间两两没有公共点。 给出n个区间,第i个区间的左右端点是[ai,bi]。现在要在这些区间中选出若干个,使这些区间两两没有公共点。保证答案存在,求可选区间个数的最大值。 注:认为区间[3,5][5,9]没有公共交点,可以同时选择,认为区间[3,6][5,9]有公共交点,不可以同时选择。 输入第一行包含一个整数n,接下来 n 行,每行两个整数ai,bi。(1<=n<=5000,1<=ai,bi<=10^9) 提示:使用贪心法解决这个问题。先用冒泡排序的思路进行结构体数组排序,然后依次抉择每个区间。 试补全程序。

#include <iostream>
using namespace std;
const int MAXN = 5000;
int n;
struct segment { 
    int a, b;
}A[MAXN];
void sort() // 排序
{
    for (int i = 0; i < n; i++)
        for (int j = i+1; j <= ①; j++)
            if ( ② )
            {
                swap(A[i],A[j]); //交换两个变量
            }
}
int main(){
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> A[i].a >> A[i].b;
    sort();
    int ans =1, r = ③;
    for (int i = 1; i < n; i++)
    {
        if(a[i].a>=r){
            ans++;
            r = A[i].b;
        }
    }
    cout << ans << endl;
    return 0;
}

①:n-1

冒泡排序外层循环i从0到n-1,内层循环j从i+1到n-1,确保所有元素两两比较。

②:A[i].b>A[j].b

按区间右端点b升序排序,若b相同则按左端点a升序,确保贪心算法正确性。

③:A[0].b

这是贪心算法的初始化,ans初始为1表示至少选择第一个区间,r初始化为第一个区间的右端点,用于后续比较。