#1458. 普及组 CSP-J 2026 初赛模拟卷 8

普及组 CSP-J 2026 初赛模拟卷 8

普及组 CSP-J 2026 初赛模拟卷 8

一、单项选择题(共 1515 题,每题 22 分,共计 3030 分;每题有且仅有一个正确选项)

{{ select(1) }} CCF 的中文全称是( )。

  • 中国计算机协会
  • 中国计算机行会
  • 中国计算机学会
  • 中国计算机公会

{{ select(2) }} 汉字输入方法实质上是对汉字进行编码。下面不是汉字输入方法的编码方式的是( )。

  • 音码
  • 形码
  • 音形码
  • ASCII 码

{{ select(3) }} 表达式 a * (b + c) * d 的后缀形式是( )。

  • a b c d * + *
  • a b c + * d *
  • a * b c + * d
  • b + c * a * d

{{ select(4) }} 在以下各项中,不是操作系统的是( )。

  • Sybase
  • Linux
  • Solaris
  • Symbian

{{ select(5) }} 二进制数 00101100001011000000101100001011 的和是( )。

  • 0010100000101000
  • 0100000101000001
  • 0100010001000100
  • .00111000.00111000

{{ select(6) }} 微型计算机在工作中电源突然中断,再次通电后数据不能恢复的是( )。

  • ROM 和 RAM 中的信息
  • ROM 中的信息
  • RAM 中的信息
  • 硬盘中的信息

{{ select(7) }} 从一个 4×44 \times 4 的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格(不计顺序),有( )种方法。

  • 7272
  • 144144
  • 256256
  • 128128

{{ select(8) }} 关于汇编语言,下列说法中错误的是( )。

  • 是一种与具体硬件相关的程序设计语言
  • 在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试
  • 可以直接访问寄存器、内存单元,以及 I/O 端口
  • 随着高级语言的诞生,如今已完全被淘汰,不再使用

{{ select(9) }} 同时掷出 33 枚完全相同的六面骰子,每枚骰子上有 1166 的数字。将得到的点数排序后,有( )种不同的结果。

  • 208208
  • 5656
  • 216216
  • 120120

{{ select(10) }} 某个 MV 是一段时长 44 分钟的视频文件。它每秒播放 1010 帧图像,每帧图像是一幅分辨率为 20482048 像素 ×1152\times 1152 像素(长宽比为 16:916:9)的 3232 位真彩色图像,其画面没有被压缩。这个视频没有音频。这个视频文件大约需要占用( )的存储空间。

  • 21GB21\text{GB}
  • 27GB27\text{GB}
  • 168GB168\text{GB}
  • 2GB2\text{GB}

{{ select(11) }} 一个有符号单字节能表达的最小二进制数是( )。

  • 1000000010000000
  • 1111111111111111
  • 0111111101111111
  • 0000000000000000

{{ select(12) }} 前序遍历序列与后序遍历序列相同的二叉树为( )。

  • 非叶节点只有左子树的二叉树
  • 只有根节点的二叉树
  • 根节点无右子树的二叉树
  • 非叶节点只有右子树的二叉树

{{ select(13) }} 下面有关数制的式子中,正确的是( )。

  • (A2B.C5)16=(101000101011.0101100)2(A2B.C5)_{16} = (101000101011.0101100)_2
  • (2)8×(6)8=(14)8(2)_8 \times (6)_8 = (14)_8
  • (110010)2+(16)10=(1000100)2(110010)_2 + (16)_{10} = (1000100)_2
  • (1000)2=(8)8(1000)_2 = (8)_8

{{ select(14) }} 若对于所有规模为 nn 的输入,一个算法均恰好进行( )次运算,则可以说该算法的时间复杂度为 O(2n)O(2^n)

  • 2n+12^{n+1}
  • 3n3^n
  • n×2nn \times 2^n
  • 22n2^{2n}

{{ select(15) }} 若 f0=0f_0=0, f1=1f_1=1, fn+1=(fn+fn1)/2f_{n+1}=(f_n+f_{n-1})/2,则随着 ii 的增大,fif_i 将接近于( )。

  • 1/21/2
  • 2/32/3
  • (51)/2(\sqrt{5}-1)/2
  • 11

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

(1)

#include <iostream>
using namespace std;

int rSum(int j) {
    int sum=0;
    while (j != 0) {
        sum = sum * 10 + (j % 10);
        j = j / 10;
    }
    return sum;
}

int main() {
    int n,m;
    cin >> n >> m; // 保证输入为正整数,但不大于 10^9
    for (int i=n; i<=m; i++)
        if (i == rSum(i)) cout << i << ' ';
    return 0;
}

判断题

{{ input(16) }} 11 分) 主函数中的 for 循环总共执行 mnm-n 次。( )

{{ input(17) }} rSum 这个函数的返回值 sum 一定不会大于 jj。( )

{{ input(18) }} 假设 n=1n=1, mm 足够大,则输出个数的量级逐渐趋近于 O(m0.5)O(m^{0.5})。( )

{{ input(19) }} 输入任意两个取值范围为 [1,100][1,100] 的整数,输出个数都不超过 100100。( )

选择题

{{ select(20) }} 若输入 190 230,总共会输出( )个数。

  • 11
  • 22
  • 33
  • 44

{{ select(21) }} 假设 nnmm 是相同量级(m=O(n)m = O(n)),则该算法的时间复杂度为( )。

  • O(n)O(n)
  • O(nlogn)O(n \log n)
  • O(n1.5)O(n^{1.5})
  • O(n2)O(n^2)

(2)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    char m1,m2;
    getline(cin,s);
    m1 = '_';
    m2 = '_';
    for (int i=0; i<s.length(); i++) {
        if (s[i] > m1) {
            m2 = m1;
            m1 = s[i];
        } else if (s[i] > m2)
            m2 = s[i];
    }
    cout << int(m1) << '_' << int(m2) << endl;
    return 0;
}

判断题

{{ input(22) }} 11 分) getline() 会将一整行连空格一起输入到字符串中。( )

{{ input(23) }} 输出的两个整数不可能相同。( )

{{ input(24) }} 去掉 else 这几个字符,则可能出现 m2>m1m_2 > m_1 的情况。( )

{{ input(25) }} 若输入长度为 1010 且仅含小写字母的随机字符串,则输出结果中 m2m_2 的值越大,其出现的可能性越小。( )

选择题

{{ select(26) }} 维护 m1m_1m2m_2 的过程最接近( )。

  • 选择排序
  • 插入排序
  • 冒泡排序
  • 计数排序

{{ select(27) }} 若输入 mxoj is the best online judge,输出为( )。

  • 120 120
  • 120 119
  • 120 117
  • 122 120

(3)

#include <iostream>
using namespace std;

int n,p,a;

int main() {
    cin >> n; // 保证输入在 int 范围内
    while (n > 1) {
        for (p=2; p<=n; p++)
            if (n % p == 0) break;
        if (a==0) n%=p; else n/=p;
        a=0; n%p==0; n/=p; a++;
        cout << p << "\t" << a <<endl;
    }
    return 0;
}

判断题

{{ input(28) }} 若输入正整数,则程序在有限步内一定会结束。( )

{{ input(29) }} 如有输出,输出的 aa 永远是正的。( )

{{ input(30) }} 最坏情况下程序的时间复杂度为 O(n2)O(n^2)。( )

{{ input(31) }} 输出的 pp 是逐行严格递增的。( )

选择题

{{ select(32) }} 若输入 7272,则其输出( )个数。

  • 11
  • 22
  • 33
  • 44

{{ select(33) }} 对 n=2..100n = 2..100 依次运行以上程序,输出的总行数最接近( )。

  • 5050
  • 100100
  • 150150
  • 200200

三、完善程序(单选题,每小题 33 分,共计 3030 分)

(1)(子矩阵)输入一个 n1×m1n_1 \times m_1 的矩阵 aa 和一个 n2×m2n_2 \times m_2 的矩阵 bb,问 aa 中是否存在一个子矩阵和 bb 相等?若存在,则输出所有子矩阵左上角的坐标;若不存在,则输出 There is no answer。子矩阵指从 aa 中选出连续的 n2n_2 行和 m2m_2 列。相等指每个对应位置的值相等。

样例输入:4 5

1 4 3 2 5
5 6 3 2 1
2 4 5 6 8
3 5 4 3 2
2 3
6 3 2
4 5 6

样例输出:2 2

#include <iostream>
using namespace std;

const int SIZE = 50;
int n1, m1, n2, m2, a[SIZE][SIZE], b[SIZE][SIZE];

int main() {
    int i, j, k1, k2;
    bool good, haveAns;
    cin >> n1 >> m1;
    for (i = 1; i <= n1; i++)
        for (j = 1; j <= m1; j++) cin >> a[i][j];
    cin >> n2 >> m2;
    for (i = 1; i <= n2; i++)
        for (j = 1; j <= m2; j++) cin >> b[i][j];

    for (i = 1; i <= n1 - n2 + 1; i++)
        for (j = 1; j <= ②; j++) {
            ③;
            for (k1 = 1; k1 <= n2; k1++)
                for (k2 = 1; k2 <= m2; k2++) {
                    if (④ != b[k1][k2])
                        good = false;
                }
            if (good) {
                cout << i << '\t' << j << endl;
                ⑤;
            }
        }

    if (!haveAns)
        cout << "There is no answer" << endl;
    return 0;
}

{{ select(34) }} ①处应填( )。

  • haveAns = true
  • haveAns = false
  • good = true
  • good = false

{{ select(35) }} ②处应填( )。

  • n1+n21n_1 + n_2 - 1
  • m1m2+1m_1 - m_2 + 1
  • n1m1+1n_1 - m_1 + 1
  • m1+m21m_1 + m_2 - 1

{{ select(36) }} ③处应填( )。

  • haveAns = true
  • haveAns = false
  • good = true
  • good = false

{{ select(37) }} ④处应填( )。

  • a[i + k1 - 1][j + k2 - 1]
  • a[i + k1][j + k2]
  • a[i - k1 - 1][j - k2 - 1]
  • a[i - k1][j - k1]

{{ select(38) }} ⑤处应填( )。

  • haveAns = true
  • haveAns = false
  • good = true
  • good = false

(2)(高精度加法)输入两个大整数,位数不超过 100100(保证首位不是 00)。使用数组存储大整数,数组的每个元素存储一位数,输出两数之和。

样例输入:

1234567
2345678

样例输出:3580245

#include <iostream>
#include <string>
#define SIZE 200
using namespace std;

int x[2][SIZE]; // x[0], x[1] 存放两个加数

void converts(int d,string s) {
    int i,len = ①;
    for (i=0; i<len; i++)
        x[d][i] = s[len-i-1] - '0';
}

void add() {
    for (int i=0;i<SIZE;i++) {
        x[0][i] += x[1][i];
        if (②) {
            x[0][i+1]++;
            ③;
        }
    }
}

void print(int d) {
    int i;
    for (i=SIZE-1; i>0; i--)
        if (x[d][i]) ④;
    for (; i>=0; i--) cout << x[d][i];
    cout<<endl;
}

int main() {
    string s1,s2;
    cin>>s1>>s2;
    converts(0,s1);
    converts(1,s2);
    add();
    ⑤;
    return 0;
}

{{ select(39) }} ①处应填( )。

  • 00
  • 11
  • s.length()
  • s.length()-1

{{ select(40) }} ②处应填( )。

  • x[0][i]>=10
  • x[0][i]>10
  • x[1][i]>=10
  • x[1][i]>10

{{ select(41) }} ③处应填( )。

  • x[0][i]+=10
  • x[0][i]-=10
  • x[1][i]+=10
  • x[1][i]-=10

{{ select(42) }} ④处应填( )。

  • return
  • continue
  • cout<<x[d][i]
  • break

{{ select(43) }} ⑤处应填( )。

  • print(0)
  • print(1)
  • print(2)
  • print(3)