#751. [CSPJ2609 初赛] 模拟题二

[CSPJ2609 初赛] 模拟题二

一、单项选择题(每题 2 分,共 30 分)

  1. 在 C++ 程序中用到的一个常量 a=5e6a= 5e-6 在内存中占( )空间。

{{ select(1) }}

  • 22 字节
  • 11 字节
  • 44 字节
  • 88 字节
  1. 以下关于 CSP 与 NOIP 的描述正确的是( )。

{{ select(2) }}

  • CSP 属于专业认证,只有计算机专业在校生才能参加
  • CSP - J/CSP - S 是中国通信学会举办的程序设计竞赛
  • CSP - J 初赛零分也可以直接报名参加 NOIP
  • CSP - J 和 CSP - S 都是 CCF 牵头举办的程序设计赛事`
  1. 某单位安装一条电信宽带进行上网,运营商说下行速度是 500500 Mbps。要下载大小为 1010 GB的软件,最快大约需要( )秒。

{{ select(3) }}

  • 22
  • 2020
  • 200200
  • 20002000
  1. 大写字母 M 的 ASCII 码整数值和空格的 ASCII 码整数值之和,是字母 m 的 ASCII 码整数值。空格的 ASCII 码整数值是( ) 。

{{ select(4) }}

  • 3232
  • 3131
  • 3030
  • 2929
  1. 在微型计算机中,( )的存取速度最快。

{{ select(5) }}

  • RAM
  • CD-ROM
  • 高速缓存
  • 寄存器
  1. 搜索算法中的 DFS 算法经常用到的数据结构是( )。

{{ select(6) }}

  • 链表
  • 队列
  1. 以下哪个说法是正确的?( )

{{ select(7) }}

  • 花括号 “{” 和 “}” 只能作为 C++ 函数体的定界符
  • 构成 C++ 程序的基本单位是函数,所有函数名都可以由用户命名
  • 分号是 C++ 语句之间的分隔符,不是语句的一部分
  • C++ 程序中的注释部分可以出现在程序中任意合适的地方
  1. 在下列排序算法中, STL 中的 sort() 函数采用的主要算法是( )。

{{ select(8) }}

  • 选择排序
  • 快速排序
  • 冒泡排序
  • 拓扑排序
  1. 以下哪个说法是正确的?( )

{{ select(9) }}

  • 第一台电子计算机 ENIAC 是基于集成电路的产物
  • 计算机必须要同时有 IP 地址和域名才能接入互联网
  • david@163.com 是一个正确的电子邮箱地址
  • 手机上收到的短信,里面的链接可以随意点击打开
  1. 以下不能对二维数组 aa 进行正确初始化的语句是( )。

{{ select(10) }}

  • int a[2][3]={{{1,2},{3,4},{5,6}}};
  • int a[][3]={{{1,2},{0}}};
  • int a[2][3]={0};
  • int a[][3]={1,2,3,4,5,6};
  1. 现在有一个八进制数 274274 ,其转换成的二进制数是( )。

{{ select(11) }}

  • 1011101110111011
  • 1011110110111101
  • 1011110010111100
  • 1010110010101100
  1. 设 A = true,B = false,C = false,D = true,以下逻辑运算表达式的值为假的是( )。

{{ select(12) }}

  • $\left(\left( \mathrm{A}\land\mathrm{B}\right)\lor\mathrm{C}\right)\land\mathrm{D}$
  • $\left( \mathrm{A} \lor \mathrm{B} \right) \land \left( \mathrm{C} \lor \mathrm{D} \right)$
  • $\mathrm{A} \land \left( \left( \mathrm{B} \lor \mathrm{C} \right) \lor \mathrm{D} \right)$
  • $\left( \mathrm{A} \land \left( \mathrm{B} \lor \mathrm{C} \right) \right) \lor \mathrm{D}$
  1. 二叉树的中序序列为 ABCEFGHD,后序序列为 ABFHGEDC,则其前序序列为 ( )。

{{ select(13) }}

  • CBADEGHF
  • CBADEGFH
  • CBDAEGFH
  • CBADGEFH
  1. 从班级中体育比较好的 1212 人中选 55 人去参加运动会,其中甲、乙、丙最多同时选两人,不同的选法共有( )种。

{{ select(14) }}

  • 792792
  • 756756
  • 720720
  • 676676
  1. 以下哪个结构可以用来存储图?( )

{{ select(15) }}

  • 二叉树
  • 邻接表
  • 队列

二、阅读程序

(程序输入不超过数组或字符串定义的范围; 除特殊说明外,判断题每题 1.51.5 分,选择题每题 33 分,共计 4040 分)

(1)

#include<iostream>
#include<cstring>
using namespace std;
char s1[1005],s2[1005];
int a[1005],b[1005],c[1005];
int main()
{
    int la,lb,lc;
    scanf("%s",s1);
    scanf("%s",s2);
    la = strlen(s1);
    lb = strlen(s2);
    lc = max(la,lb) + 1;
    for(int i=0;i<la;++i)
        a[la-i] = s1[i] - '0';
    for(int i=0;i<lb;++i)
        b[lb-i] = s2[i] - '0';
    for(int i=1;i<=lc;i++)
    {
        c[i] += a[i] + b[i];
        c[i+1] = c[i]/10;
        c[i] = c[i]%10;
    }
    if(c[lc]==0 && lc>0)
        lc--;
    for(int i=lc;i>0;i--)
        printf("%d",c[i]);
    return 0;
}

(1) 将第 22 行代码改为 #include<stdio.h> ,程序的运行结果不会改变。 ( )

{{ select(16) }}

  • 正确
  • 错误

(2) 将第 9109\sim 10 行代码改为 cin>>s1>>s2; ,程序的运行结果不会改变。 ( )

{{ select(17) }}

  • 正确
  • 错误

(3) 若输入两个都超过 10051005 位长的正整数,则程序一定会出错且无输出。 ( )

{{ select(18) }}

  • 正确
  • 错误

(4) 在输入 00 00 的情况下,将第 2424 行代码中的 lc>0 去掉,程序的运行结果不会改变。 ( )

{{ select(19) }}

  • 正确
  • 错误

(5) 若输入数据为 10241024 10001000 ,则输出为( )。

{{ select(20) }}

  • 2424
  • 20242024
  • 10241024
  • 10001000

(6) 若输入数据为 11 1-1 ,则输出为( )。

{{ select(21) }}

  • 11
  • 00
  • 1-1
  • 以上都不是

(2)

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int n, a[MAXN], b[MAXN];
void mergesort(int *a, int l, int r)
{
    int i,j,cnt,mid;
    if (l == r)
        return;
    mid = (l + r)/2;
    mergesort(a, l, mid);
    mergesort(a, mid + 1, r);
    i = l, j = mid + 1, cnt = 0;
    while (i <= mid && j <= r)
    {
        if (a[i] <= a[j])
            b[++cnt] = a[i++];
        else
            b[++cnt] = a[j++];
    }
    while (i <= mid)
        b[++cnt] = a[i++];
    while (j <= r)
        b[++cnt] = a[j++];
    for (i = l; i <= r; i++)
        a[i] = b[i - l + 1];
}
int main(void)
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    mergesort(a, 1, n);
    for (int i = 1; i <= n; i++)
        cout << a[i] << (i == n ? '\n' : ' ');
    return 0;
}

(1) 该排序算法用到的是不稳定的排序算法。 ( )

{{ select(22) }}

  • 正确
  • 错误

(2) 将第 1010 行改为 mid = l+r >> 1; ,程序的输出结果不变。 ( )

{{ select(23) }}

  • 正确
  • 错误

(3) 该排序算法用到了分治的思想。 ( )

{{ select(24) }}

  • 正确
  • 错误

(4) 第 3535 行代码用到的三目运算符处理代码可以用等价的条件语句来写。 ( )

{{ select(25) }}

  • 正确
  • 错误

(5) 在最坏情况下,该算法的时间复杂度和下面哪个算法相当?( )

{{ select(26) }}

  • 插入排序
  • 选择排序
  • 堆排序
  • 快速排序

(6) 若输出 22 33 55 77 88 ,则输入可能为( )。

{{ select(27) }}

  • 11 22 44 66 77
  • 22 33 55 77 88
  • 33 77 55 22 88
  • 88 33 55 22 77

(33)

#include<bits/stdc++.h>
using namespace std;
int t,x[100],a[100];
void dfs(int d,int i,int n)
{
    if(n==1)
    {
        for(int k=0;k<d;k++)
            printf("%4d",a[k]);
        printf("\n");
    }
    else
        for(int k=i;k<t;k++)
            if(n%x[k]==0)
            {
                a[d]=x[k];
                dfs(d+1,k,n/x[k]);
            }
}
int main()
{
    int n;
    cin>>n;
    for(int i=n;i>1;i--)
        if(n%i==0)
            x[t++]=i;
    dfs(0,0,n);
    return 0;
}

(1) 该程序的作用是对 nn 进行质因数分解并从小到大依次打印。 ( )

{{ select(28) }}

  • 正确
  • 错误

(2) 将第 99 行代码 printf("%4d",a[k]); 中的 44 去掉,程序输出不变。 ( )

{{ select(29) }}

  • 正确
  • 错误

(3) 第 242624 \sim 26 行的作用是求出 nn 的所有因子。 ( )

{{ select(30) }}

  • 正确
  • 错误

(4) 程序运行过程中,若输入 nn00 或者负数,程序一定会打印错误,崩溃退出。

{{ select(31) }}

  • 正确
  • 错误

(5) 若输入 66 ,则输出为( )。

{{ select(32) }}

  • 6
    3 2
    
  • 72
    36 2
    
  • 6
    2 3
    
  • 72
    2 36
    

(6) 若输入 11 ,那么输出结果可能是( )。

{{ select(33) }}

  • 22
  • 11
  • 00
  • 什么也不输出

(7) (44 分)若输入 20242024 ,则输出有( )行。

{{ select(34) }}

  • 1818
  • 2020
  • 2121
  • 1919

三、完善程序

单项选择题,每题 33 分,共 3030 分。

(1) 扫雷游戏是一款十分经典的单机小游戏。在 nnmm 列的雷区中有一些格子含有地雷(称为地雷格),其他格子不含地雷(称为非地雷格)。玩家翻开一个非地雷格时,该格子中将会出现一个数字,提示周围格子中有多少个是地雷格。玩家的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。请将程序补充完整。现在给出 nnmm 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下这 88 个方向上与之直接相邻的格子。

输入格式: 第 11 行是用一个空格隔开的两个整数 nnmm ,分别表示雷区的行数和列数。接下来 nn 行,每行 mm 个字符,描述了雷区中的地雷分布情况。字符 * 表示相应格子是地雷格,字符?表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式: 输出文件包含 nn 行,每行 mm 个字符,描述整个雷区。用 * 表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

3 3
*??
???
???
*10
221
1*1
#include<bits/stdc++.h>
using namespace std;
const int dx[] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
char g[101][101];
int main()
{
    int n,m,cnt;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>g[i][j];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            if ( ① )
            {
                ②;
                for (int k = 0; ③ ; k++)
                    if ( ④ )
                        cnt++;
                    cout << cnt;
            }
            else
                cout<<"*";
            if( ⑤ )
                cout<<endl;
        }
    return 0;
}

(1) ① 处应填( )

{{ select(35) }}

  • g[i][j] != '?'
  • g[i][j] != '\0'
  • g[i][j] != ' * '
  • g[i][j] == ' * '

(2) ② 处应填( )

{{ select(36) }}

  • cnt++
  • cnt = 0
  • cnt = 0
  • ++cnt = 0

(3) ③ 处应填( )

{{ select(37) }}

  • k < 8
  • k < m
  • k < n
  • k < min(m,n)

(4) ④ 处应填( )

{{ select(38) }}

  • g[i + dy[k]][j + dx[k]] == ' \star '
  • g[i - dx[k]][j - dy[k]] == ' \star '
  • g[i + dx[k]][j + dy[k]] == ' \star '
  • g[i - dy[k]][j - dx[k]] == ' \star '

(5) ⑤ 处应填( )

{{ select(39) }}

  • j != m
  • j != m - 1
  • i != n
  • i != n - 1

(22) 给你 nn 根火柴棍,你可以拼出多少个形如 A+B=C 的等式? 等式中的 A 、 B 、 C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00 )` 。用火柴棍拼数字 090\sim 9 的拼法如图所示。

注意:

  1. 加号与等号各自需要两根火柴棍;
  2. 如果 A 不等于 B,则视 A+B=C 与 B+A=C 为不同的等式(A,B,C 0≥0);
  3. nn 根火柴棍必须全部用上。

输入格式: 一个整数 n(1n24)n(1≤n≤24)

输出格式: 一个整数,表示能拼成的不同等式的数目。

输入样例: 1818

输出样例: 99

样例说明: 99 个等式为 0+4=40+4=40+11=110+11=111+10=111+10=112+2=42+2=42+7=92+7=94+0=44+0=47+2=97+2=910+1=1110+1=1111+0=1111+0=11

#include<bits/stdc++.h>
using namespace std;
int hcb[10]={6,2,5,5,4,5,6,3,7,6};
int n;
int matches(int num)
{
    int i,k=0;
    for(i=num;i!=0;①)
        ② ;
    if( ③ )
        k+=hcb[0];
    return k;
}
int main()
{
    int i,j,count;
    ④;
    cin>>n;
    for(i=0;i<=1000;i++)
        for(j=0;j<=1000;j++)
            if( ⑤ )
                count++;
    cout<<count;
    return 0;
}

(1) ① 处应填( )

{{ select(40) }}

  • i %= 10
  • i /= 10
  • i++
  • i--

(2) ② 处应填( )

{{ select(41) }}

  • k + = hcb[i]
  • k + = hcb[i / 10]
  • k + = hcb[i / 10 % 10]
  • k + = hcb[i % 10]

(3) ③ 处应填( )

{{ select(42) }}

  • num == 0
  • num!=0
  • num == n
  • num!=n

(4) ④ 处应填( )

{{ select(43) }}

  • count=1
  • count=match(n)
  • count=0
  • count=n

(5) ⑤ 处应填( )

{{ select(44) }}

  • matches(i) + matches(j) + matches(i + j) + 6 == n
  • matches(i) + matches(j) + matches(i + j) + 3 == n
  • matches(i) + matches(j) + matches(i + j) + 4 == n
  • matches(i) + matches(j) + matches(i + j) + 5 == n