2023年CSP-J 真题试卷
一、 单项选择题 (共15题,每题2分,共计30分:每题有且仅有一个正确选项)
1) 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )




查看答案
2) 八进制数12345670(8) 和07654321(8)的和为( )





查看答案
3) 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。
union Data{
    int num;    
    float value;    
    char symbol;
};
union Data data;




查看答案
4) 假设有一个链表的节点定义如下:
struct Node {
    int data;    
    Node* next;
};
现在有一个指向链表头部的指针:Node* head。如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )




查看答案
5) 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。




查看答案
6) 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息,则小明一共有( )种选择时间段的方案。




查看答案
7) 以下关于高精度运算的说法错误的是( )。




查看答案
8) 后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( )




查看答案
9) 数101010(2)和166(8)的和为( )




查看答案
10) 假设有一组字符{a,b,c,d,e,f},对应的频率分别为5%,9%,12%,13%,16%,45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?( )




查看答案
11) 给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?( )




查看答案
12) 考虑一个有向无环图,该图包括4条有向边:(1,2),(1,3),(2,4),和(3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序?( )




查看答案
13) 在计算机中,以下哪个选项描述的数据存储容量最小?( )




查看答案
14) 一个班级有10个男生和12个女生。如果要选出一个3人的小组,并且小组中必须至少包含1个女生,那么有多少种可能的组合?( )




查看答案
15) 以下哪个不是操作系统?( )




查看答案
二、 阅读程序 (程序输入不超过数组成字符串定义的范围:判断题正确填√,错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)
有以下程序:
#include<iostream>
#include<cmath>
using namespace std;

double f(double a,double b,double c){
    double s=(a+b+c)/2;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}

int main(){
   cout.flags(ios::fixed);
   cout.precision(4);
   
   int a,b,c;
   cin>>a>>b>>c;
   cout<<f(a,b,c)<<endl;
   return 0;
}
假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
16) 当输入为“2 2 2”时,输出为“1.7321”( )

查看答案
17) 将第7行中的"(s-b)* (s-c)"改为"(s-c)*(s-b)"不会影响程序运行的结果( )

查看答案
18) 程序总是输出四位小数( )

查看答案
19) 当输入为“3 4 5”时,输出为( )




查看答案
20) 当输入为“5 12 13”时,输出为( )




查看答案
模拟计算
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
int f(string x,string y){
    int m=x.size();
    int n=y.size();
    vector<vector<int>>v(m+1,vector<int>(n+1,0));
   for(int i=1;i<=m;i++){
       for(int j=1;j<=n;j++){
            if(x[i-1]==y[j-1]){
                v[i][j]=v[i-1][j-1]+1;
            }else{
                v[i][j]=max(v[i-1][j],v[i][j-1]);
            }
        }
    }
    return v[m][n];
}

bool g(string x,string y){
    if(x.size() != y.size()){
        return false;
    }
    return f(x+x,y)==y.size();
}

int main(){
    string x,y;
    cin>>x>>y;
    cout<<g(x,y)<<endl;
    return 0;
}
分析:
函数f计算最长公共子序列
函数g检查x是否可以通过多次变化变成y
v[i][j]表示字符串x的前i个字符和字符串y的前j个字符的最长公共子序列的长度
21) f函数的返回值小于等于min(n,m)( )

查看答案
22) f函数的返回值等于两个输入字符串的最长公共子串的长度( )

查看答案
23) 当输入两个完全相同的字符串时,g函数的返回值总是true( )

查看答案
24) 将第19行中的“v[m] [n]”替换为“v[n] [m]”,那么该程序( )




查看答案
25) 当输入为“csppsc spsccp”时,输出为:( )




查看答案
有以下程序:
#include <iostream>
#include <cmath>
using namespace std;
 
int solve1(int n){
    return n*n;
}

int solve2(int n){
   int sum=0;
   for(int i=1;i<=sqrt(n);i++){
        if(n%i==0){
            if(n/i==i){
                sum+=i*i;
            }else{
                sum+=i*i+(n/i)*(n/i);
            }
        }
    }
    return sum;
}

int main(){
    int n;
    cin>>n;
    cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
    return 0;
}
假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。
27) 如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )

查看答案
28) 第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )

查看答案
29) 如果输入的n为质数,solve2(n)的返回值为n^2+1( )

查看答案
30) 如果输入的n为质数p的平方,那么solve2(n)的返回值为( )




查看答案
31) 当输入为正整数时,第一项减去第二项的差值一定( )




查看答案
32) 当输入为“5”时,输出为( )




查看答案
三、完善程序 (单选题,每小题3分,共计 30 分)
寻找被移除的元素
问题:原有长度为 n+1,公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的开序数组可能不再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出被移除的元素。试补全程序。
#include <iostream>
#include <vector>

using namespace std;

int find_missing(vector<int>& nums){
	int left = 0, right = nums.size() - 1;
	while (left < right){
  		int mid = left + (right-left) / 2;
  		if (nums[mid]==mid+ ①){
       		②;
   		}else{
     		③
   		}
  	}
 	return ④;
}

int main(){
	int n;
	cin >> n;
	vector<int> nums(n);
	for (int i= 0; i< n; i++) cin >> nums[i];
	int missing_number = find_missing(nums);
	if(missing_number == ⑤) {
    		cout << "Sequence is consecutive" << endl;
	}else{
   		cout << "Missing number is " << missing numbeer << endl;
	}
	return 0;
}
33) ①处应填( )




查看答案
34) ②处应填( )




查看答案
35) ③处应填( )




查看答案
36) ④处应填( )




查看答案
37) ⑤处应填( )




查看答案
编辑距离
给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
  
int min(int x,int y,int z){
	return min(min(x,y),z);
} 
int edit_dist_dp(string str1,string str2){
	int m=str1.length();
	int n=str2.length();
	vector<vector<int>> dp(m+1,vector<int>(n+1));

	for(int i=0;i<=m;i++){
		for(int j=0;j<=n;j++){
			if(i==0)
				dp[i][j]=①;
			else if(j==0)
				dp[i][j]=②;
			else if(③)
				dp[i][j]=④;
			else
				dp[i][j]=1+min(dp[i][j-1],dp[i-1][j],⑤); 
		}
	}
	return dp[m][n];
}
 
int main(){
	string str1,str2;
	cin>>str1>>str2;
	cout<<"Mininum number of operation:"
		<<edit_dist_dp(str1,str2)<<endl;
	return 0; 
}

38) ①处应填( )




查看答案
39) ②处应填( )




查看答案
40) ③处应填( )




查看答案
41) ④处应填( )




查看答案
42) ⑤处应填( )




查看答案
增值服务权益

1. 试题参考答案和解析查看;
2. 试卷模拟测试;
3. 随机组题测试;
4. 试卷PDF文件下载;
5. 赠送等值学豆;

  订阅  
学员服务
教研服务

小鹏STEM教研服务系统是面向教师的一站式教研、教学和知识管理系统。
订阅服务后,所有题目均可无限制查看和服务。

  详情