#ACSP1002. cspj-模拟题2

cspj-模拟题2

普及组CSP-J 2024 初赛模拟卷2

单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

  1. 在C++程序中用到的一个常量a =5e-6在内存中占 ({{ select(1) }})空间。
  • 2字节
  • 1字节
  • 4字节
  • 8字节
  1. 以下关于 CSP 与NOIP 的描述正确的是 ({{ select(2) }})。
  • CSP属于专业认证,只有计算机专业在校生才能参加
  • CSP-J/CSP-S是中国通信学会举办的程序设计竞赛
  • CSP-J初赛零分也可以直接报名参加 NOIP
  • CSP-J和CSP-S都是CCF牵头举办的程序设计赛事
  1. 某单位安装一条电信宽带进行上网,运营商说下行速度是500Mbps。要下载大小为10 GB的软件,最快大约需要 ({{ select(3) }})秒。
  • 2
  • 20
  • 200
  • 2000
  1. 大写字母M 的 ASCII 码整数值和空格的ASCII码整数值之和, 是字母m的ASCII码整数值。空格的ASCⅡ码整数值是 ({{ select(4) }})。
  • 32
  • 31
  • 30
  • 29
  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. 以下不能对二维数组a进行正确初始化的语句是 ({{ 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. 现在有一个八进制数274,其转换成的二进制数是({{ select(11) }})。
  • 10111011
  • 10111101
  • 10111100
  • 10101100
  1. 设A=true, B=false, C=false, D=true, 以下逻辑运算表达式的值为假的是({{ select(12) }})。
  • ((A∧B)∨C)∧D
  • (A∨B)∧(C∨D)
  • A∧((B∨C)∨D)
  • (A∧(B∨C))∨D
  1. 二叉树的中序序列为 ABCEFGHD, 后序序列为 ABFHGEDC, 则其前序序列为({{ select(13) }})。
  • CBADEGHF
  • CBADEGFH
  • CBDAEGFH
  • CBADGEFH
  1. 从班级中体育比较好的12人中选5人去参加运动会,其中甲、乙、丙最多同时选两人,不同的选法共有 ({{ select(14) }})种。
  • 792
  • 756
  • 720
  • 676
  1. 以下哪个结构可以用来存储图? ({{ select(15) }})
  • 二叉树
  • 邻接表
  • 队列

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填✔,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)

(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. 将第2行代码改为#include<stdio.h>, 程序的运行结果不会改变。 ({{ select(16) }})
  • 正确
  • 错误

17.将第9~10行代码改为cin>>s1>>s2;, 程序的运行结果不会改变。 ({{ select(17) }})

  • 正确
  • 错误

18.若输入两个都超过1005位长的正整数,则程序一定会出错且无输出。 ({{ select(18) }})

  • 正确
  • 错误

19.在输入0 0的情况下,将第24行代码中的lc>0去掉,程序的运行结果不会改变。 ({{ select(19) }})

  • 正确
  • 错误

选择题

  1. 若输入数据为1024 1000, 则输出为({{ select(20) }})。
  • 24
  • 2024
  • 1024
  • 1000

21.若输入数据为1 -1,则输出为 ({{ select(21) }})。

  • 1
  • 0
  • -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;
}

22.该排序算法用到的是不稳定的排序算法。 ({{ select(22) }})

  • 正确
  • 错误

23.将第 10行改为mid = l + r >> 1;, 程序的输出结果不变。 ({{ select(23) }})

  • 正确
  • 错误

24.该排序算法用到了分治的思想。 ({{ select(24) }})

  • 正确
  • 错误

25.第35行代码用到的三目运算符处理代码可以用等价的条件语句来写。 ({{ select(25) }})

  • 正确
  • 错误

选择题

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

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

27.若输出2 3 5 7 8, 则输入可能为 ({{ select(27) }})。

  • 1 2 4 6 7
  • 8 7 5 2 3
  • 3 4 2 5 7
  • 8 2 3 4 5

(3)

#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;
}

28.该程序的作用是对n进行质因数分解并从小到大依次打印。 ({{ select(28) }})

  • 正确
  • 错误

29.将第9行代码printf("%4d",a[k]);中的4去掉, 程序输出不变。 ({{ select(29) }})

  • 正确
  • 错误

30.第24~26行的作用是求出n的所有因子。 ({{ select(30) }})

  • 正确
  • 错误

31.程序运行过程中,若输入n为0或者负数,程序一定会打印错误,崩溃退出。 ({{ select(31) }})

  • 正确
  • 错误

选择题

  1. 若输入6, 则输出为 ({{ select(32) }})。
  • 6
  • 72
  • 6
  • 72

33.若输入n=1,那么输出结果可能是 ({{ select(33) }})。

  • 2
  • 1
  • 0
  • 什么也不输出

34.(4分)若输入2024, 则输出有({{ select(34) }})行。

  • 18
  • 20
  • 21
  • 19

完善程序(单选题,每小题3分,共计30分)

(1) 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称为地雷格),其他格子不含地雷(称为非地雷格)。玩家翻开一个非地雷格时,该格子中将会出现一个数字,提示周围格子中有多少个是地雷格。玩家的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。请将程序补充完整。

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。

注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下这8个方向上与之直接相邻的格子。 输入格式:

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

输出格式:

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

输入样例:

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 ( g[i][j] != '*' ) // ①
           {
              cnt = 0; // ②
              for (int k = 0; k < 8; k++) // ③
                 if ( g[i + dx[k]][j + dy[k]] == '*' ) // ④
                    cnt++;
              cout << cnt;
           }
           else
              cout<<"*";
        if(i != n-1) // ⑤
           cout<<endl;
    }
    return 0;
}

35.①处应填 ({{ select(35) }})。

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

36.②处应填({{ select(36) }})。

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

37.③处应填({{ select(37) }})。

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

38.④处应填({{ select(38) }})。

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

39.⑤处应填({{ select(39) }})。

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

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

注意:

加号与等号各自需要两根火柴棍;

如果A不等于B, 则视A+B=C与B+A=C为不同的等式(A,B,C≥0); n根火柴棍必须全部用上。

输入格式:

一个整数 n(1≤n≤24)。

输出格式:

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

输入样例:

18

输出样例:

9

样例说明:

9 个等式为 0+4=4、 0+11=11、 1+10=11、 2+2=4、 2+7=9、 4+0=4、 7+2=9、10+1=11、 11+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;i/=10) // ①
       k += hcb[i%10]; // ②
    if(num!=0) // ③
       k+=hcb[0];
    return k;
}
int main()
{
    int i,j, count=0; // ④
    cin>>n;
    for(i=0;i<=1000;i++)
       for(j=0;j<=1000;j++)
           if(matches(i)+matches(j)+matches(i+j)+6==n) // ⑤
              count++;
    cout<<count;
    return 0;
}

40.①处应填 ({{ select(40) }})。

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

41.②处应填 ({{ select(41) }})。

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

42.③处应填 ({{ select(42) }})。

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

43.④处应填 ({{ select(43) }})。

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

44.⑤处应填 ({{ 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