1

历年CSP-J初赛真题解析 | 2014年CSP-J初赛

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客


单项选择

第1题

以下哪个是面向对象的高级语言( )。

A.汇编语言

B.C++

C.Fortran

D.Basic

【答案】:B

【解析】

高级语言对人类更友好,如C/C++/Python/Pascal/Fortran/Basic。Fortran/Baisc/C都是面向过程的语言

第2题

1TB代表的字节数是( )。

A.2的10次方

B.2的20次方

C.2的30次方

D.2的40次方

【答案】:D

【解析】

\(1TB=1024(G)*1024(M)*1024(K)*1024=2^{40}B\)

第3题

二进制数00100100和00010101的和是( )。

A.00101000

B.001010100

C.01000101

D.00111001

【答案】:D

【解析】

按位加,1+1需要进位

第4题

以下哪一种设备属于输出设备( )。

A.扫描仪

B.键盘

C.鼠标

D.打印机

【答案】:D

【解析】

A/B/C都是输入设备

第5题

下列对操作系统功能的描述最为完整的是( )。

A.负责外设与主机之间的信息交换

B.负责诊断机器的故障

C.控制和管理计算机系统的各种硬件和软件资源的使用

D.将源程序编译成目标程序

【答案】:C

【解析】

A是接口的功能,B是操作系统部分功能,如BIOS的功能,D是编译器功能

第6题

CPU、存储器、I/O设备是通过( )连接起来的。

A.接口

B.总线

C.控制线

D.系统文件

【答案】:B

【解析】

接口是连接外部设备,主机内部是通过主板上的总线连接起来的

第7题

断电后会丢失数据的存储器是( )

A.RAM

B.ROM

C.硬盘

D.光盘

【答案】:A

【解析】

RAM(Random Access Memory)是随机存取存储器,断电后会消失。ROM(Read Only Memory)是只读存储器,断电后不会消失。BIOS程序就是放在ROM中。

第8题

以下哪一种是属于电子邮件收发的协议( )。

A.SMTP

B.UDP

C.P2P

D.FTP

【答案】:A

【解析】

电子邮件协议:SMTP和POP3

第9题

下列选项中不属于图像格式的是( )。

A.JPEG格式

B.TXT格式

C.GIF格式

D.PNG格式

【答案】:B

【解析】

txt是文本格式

第10题

链表不具有的特点是( )。

A.不必事先估计存储空间

B.可随机访问任一元素

C.插入删除不需要移动元素

D.所需空间与线性表长度成正比

【答案】:B

【解析】

数组可以随机访问,但链表需要从头遍历

第11题

下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。

A.296

B.1133

C.256

D.199

【答案】:D

【解析】

8位:\(2^8\)个,0~255

第12题

下列几个32位IP地址中,书写错误的是( )。

A.162.105.135.27

B.192.168.0.1

C.256.256.129.1

D.10.0.0.1

【答案】:C

【解析】

IPv4中4个数字,最多只能到255

第13题

要求以下程序的功能是计算:s=1+1/2+1/3+...+1/10。

#include <iostream>
using namespace std;
int main() {
	int n;
	float s;
	s = 1.0;
	for (n=10; n>1; n--)
		s = s + 1/n;
	cout << s <<endl;
	return 0;
}

程序运行后输出结果错误,导致错误结果的程序行是( )。

A.s=1.0;

B.for(n=10; n>1; n--)

C.s=s+1/n;

D.cout<<s<<endl;

【答案】:C

【解析】

初值已经是1了,所以B答案没错,只需要加到1/2。1/n结果是整形,需要写成1.0/n

第14题

设变量x为float型且已赋值, 则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是( )。

A.\(x=(x*100)+0.5/100.0;\)

B.\(x=(x*100+0.5)/100.0;\)

C.\(x=(int)(x*100+0.5)/100.0;\)

D.\(x=(x*100+0.5)*100.0;\)

【答案】:C

【解析】

可以代入12.3456,计算发现C选项正确

第15题

有以下程序:

#include <iostream>
using namespace std;
int main() {
	int s, a, n;
	s = 0;
	a = 1;
	cin >> n;
	do {
		s+=1;
		a-=2;
	} while (a!=n);
	cout << s <<endl;
	return 0;
}

若要使程序的输出值为2,则应该从键盘给n输入的值是( )。

A.-1

B.-3

C.-5

D.0

【答案】:B

【解析】

s=2,a=-3。如果要a==n结束循环,那么n就需要等于-3

第16题

一棵具有5层的满二叉树中结点数为( )。

A.31

B.32

C.33

D.16

【答案】:A

【解析】

\(2^n-1\),n为5,结点数为31

第17题

有向图中每个顶点的度等于该顶点的( )。

A.入度

B.出度

C.入度和出度之和

D.入度和出度之差

【答案】:C

【解析】

基本概念,有向图中顶点的度为入度和出度之和

第18题

设有100个数据元素,采用折半搜索时,最大比较次数为( )。

A.6

B.7

C.8

D.10

【答案】:B

【解析】

log100=7

1次50,2次25,3次13(最大比较次数),4次7,5次4,6次2,7次1

第19题

若有如下程序段,其中s、a、b、c均已定义为整型变量,且a、c均已赋值,c>0。

s = a;
for (b=1; b<=c; b++)
	s += 1;

则与上述程序段功能等价的赋值语句是( )。

A.s=a+b

B.s=a+c

C.s=s+c

D.s=b+c

【答案】:B

【解析】

循环c次,每次加1,相当于a+c

第20题

计算机界的最高奖是( )。

A.菲尔兹奖

B.诺贝尔奖

C.图灵奖

D.普利策奖

【答案】:C

【解析】

菲尔兹是数学届,诺贝尔有五个奖,普利策是摄影界

问题求解

第21题

把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(用K表示)

例如:M=7,N=3时,K=8;在这里认为(5,1,1)和(1,5,1)是同一种放置方法。

问:M=8,N=5时,K=( )。

【答案】:18

【解析】

(初赛中直接用枚举法)

8个球装入1个袋中:1(8)

8个球装入2个袋中:4(1+7、2+6、3+5、4+4)

8个球装入3个袋中:5(1+1+6、1+2+5、1+3+4、2+2+4、2+3+3)

8个球装入4个袋中:5(1+1+1+5、1+1+2+4、1+1+3+3、1+2+2+3、2+2+2+2)

8个球装入5个袋中:3(1+1+1+1+4、1+1+1+2+3、1+1+2+2+2)

第22题

如图所示,图中每条边上的数字表示该边的长度,则从A到E的最短距离是( )。

image

【答案】:11

【解析】

用Dijstra来求,也可以直接看出结果:3+1+1+6=11

点标号 A B C D E F G
从A触发到每个点的最短距离 0 \(+\infty\) \(+\infty\) \(+\infty\) \(+\infty\) \(+\infty\) \(+\infty\)
点标号 A B C D E F G
从A触发到每个点的最短距离 0 3 \(+\infty\) \(+\infty\) \(+\infty\) 6 4
点标号 A B C D E F G
从A触发到每个点的最短距离 0 3 4 8 12 6 4
点标号 A B C D E F G
从A触发到每个点的最短距离 0 3 4 8 12 5 4
点标号 A B C D E F G
从A触发到每个点的最短距离 0 3 4 8 11 5 4

阅读程序

#include <iostream>
using namespace std;
int main() {
    int a, b, c, d, ans;
    cin >> a >> b >> c;
    d = a-b;
    a = d+c;
    ans = a*b;
    cout << "Ans=" << ans << endl;
    return 0;
}

第23题

输入:2 3 4

输出:( )

【答案】:Ans=9

【解析】

模拟代入运算,注意输出格式不含空格

#include <iostream>
using namespace std;
int fun(int n) {
    if (n==1) return 1;
    if (n==2) return 2;
    return fun(n-2) - fun(n-1);
}
int main() {
    int n;
    cin >> n;
    cout << fun(n) << endl;
    return 0;
}

第24题

输入:7

输出:( )

【答案】:-11

【解析】

fun(7)=fun(5)-fun(6),...,fun(3)=fun(1)-fun(2)

计算结果fun(7)=-11

#include <iostream>
#include <string>
using namespace std;
int main() {
    string st;
    int i, len;
    getline(cin, st);
    len = st.size();
    for (i=0; i<len; i++) {
        if (st[i]>='a' && st[i]<='z') 
            st[i]=st[i]-'a'+'A';
    }
    cout << st << endl;
    return 0;
}

第25题

输入:Hello, my name is Lostmonkey.

输出:( )

【答案】:HELLO, MY NAME IS LOSTMONKEY.

【解析】

第10到第11行,就是将小写字母转为大写字母

#include <iostream>
using namespace std;
const int SIZE=100;
int main() {
    int p[SIZE];
    int n, tot, i, cn;
    tot = 0;
    cin >> n;
    for (i=1; i<=n; i++) p[i] = 1;
    for (i=2; i<=n; i++) {
        if (p[i]==1) tot++;
        cn = i*2;
        while (cn<=n) {
            p[cn] = 0;
            cn += i;
        } 
    }
    cout << tot << endl;
    return 0;
}

第26题

输入:30

输出:( )

【答案】:10

【解析】

第13至第16行,是为了将i的倍数都置为0。只有质数不是任何数的倍数。30以内的质数有2,3,5,7,11,13,17,19,23,29,共10个

完善程序

(数字删除)下面程序的功能是将字符串中的数字字符删除后输出。请填空。

#include <iostream>
using namespace std;
int delnum(char *s) {
    int i, j;
    j = 0;
    for (i=0; s[i]!='\0'; i++) 
        if (s[i]<'0' __1__ s[i]>'9') {
            s[j] = s[i];
            __2__;
        }
    return __3__;
}
const int SIZE = 30;
int main() {
    char s[SIZE];
    int len, i;
    cin.getline(s, sizeof(s));
    len = delnum(s);
    for (i=0; i<len; i++) cout << __4__;
    cout << endl;
    return 0;
}

第27题

1处填:( )

【答案】:||

【解析】

目的是判断非数字的字符,保留下来

第28题

2处填:( )

【答案】:j++

【解析】

非数字字符也存在s中,使用j下标来记录

第29题

3处填:( )

【答案】:j

【解析】

最后一个非数字字符赋值完后,j++后就是新的字符串的长度

第30题

4处填:( )

【答案】:s[i]

【解析】

基于新的字符串长度(不是之前的长度),输出所有字符

(最大子矩阵和)给出m行n列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。

输入第一行包含两个整数m和n,即矩阵的行数和列数。之后m行,每行n个整数,描述整个矩阵。程序最终输出最大的子矩阵和。

#include <iostream>
using namespace std;
const int SIZE=100;
int matrix[SIZE+1][SIZE+1];
int rowsum[SIZE+1][SIZE+1];
//rowsum[i][j]记录第i行前j个数的和
int m, n, i, j, first, last, area, ans;
int main() {
    cin >> m >> n;
    for (i=1; i<=m; i++)
        for (j=1; j<=n; j++)
            cin >> matrix[i][j];
    ans = matrix__1__;
    for (i=1; i<=m; i++)
        __2__;
    for (i=1; i<=m; i++)
        for (j=1; j<=n; j++)
            rowsum[i][j] = __3__;
    for (first=1; first<=n; first++)
        for (last=first; last<=n; last++) {
            __4__;
            for (i=1; i<=m; i++) {
                area += __5__;
                if (area>ans) ans = area;
                if (area<0) area = 0;
            }
        }
    cout << ans << endl;
    return 0;
}

第31题

1处填:( )

【答案】:[1][1]

【解析】

使用matrix第1行第1列的值作为ans的最大值(初值,这里并没有使用-1e9作为最大值的初值)

第32题

2处填:( )

【答案】:rowsum[i][0] = 0

【解析】

为每一行的前缀和赋初值为0(感觉不赋值也行)

第33题

3处填:( )

【答案】:rowsum[i][j-1]+matrix[i][j]

【解析】

前缀和的计算公式

第34题

4处填:( )

【答案】:area = 0

【解析】

每一次计算子矩阵和,就需要初始化初值为0

第35题

5处填:( )

【答案】:rowsum[i][last] - rowsum[i][first-1]

【解析】

area需要依次增加每行每段(起始列~终止列)的前缀和

posted @ 2026-01-19 22:28  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报