2023年普及组初赛真题

本文通过一系列C++编程语言的基础题目,涵盖了变量声明、八进制运算、联合体使用、链表操作、高精度计算、后缀表达式转换、哈夫曼编码、二叉树遍历、有向无环图、操作系统概念以及动态规划算法的应用,旨在检验和复习编程基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.【 单选 】2 分

在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?()

  • A.

    unsigned

  • B.

    const

  • C.

    static

  • D.

    mutable

A

B

C

D

2.【 单选 】2 分

八进制数12345670(8)和07654321(8)的和为()

  • A.

    22222221(8)

  • B.

    21111111(8)

  • C.

    22111111(8)

  • D.

    22222211(8)

A

B

C

D

3.【 单选 】2 分

阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是()。

union Data{
	int num;
	float value;
	char symbol;
}; 
union Data data;
  • A.

    data.value=3.14;

  • B.

    value.data=3.14;

  • C.

    data->value=3.14;

  • D.

    value->data=3.14;

A

B

C

D

4.【 单选 】2 分

假设有一个链表的节点定义如下:

struct Node{
	int data;
	Node* next;
};

现在有一个指向链表头部的指针:Node* head,如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个节点,下面哪个操作时正确的?()

  • A.
    Node* newNode=new Node;newNode->data=42; newNode->next=head;head=newNode; 
  • B.
    Node* newNode=new Node;head->data=42;newNode->next=head;head=newNode;  
  • C.
    Node* newNode=new Node;newNode->data=42; head->next=newNode;
  • D.
    Node* newNode=new Node;newNode->data=42; newNode->next=head;

A

B

C

D

5.【 单选 】2 分

根节点的高度为1,一棵拥有2023个节点的三叉树的高度至少为()。

  • A.

    6

  • B.

    7

  • C.

    8

  • D.

    9

A

B

C

D

6.【 单选 】2 分

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

  • A.

    31

  • B.

    18

  • C.

    21

  • D.

    33

A

B

C

D

7.【 单选 】2 分

以下关于高精度运算的说法错误的是()。

  • A.

    高精度计算主要是用来处理大整数或需要保留多位小数的运算。

  • B.

    大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。

  • C.

    高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。

  • D.

    高精度加法运算的关键在于逐位相加并处理进位。

A

B

C

D

8.【 单选 】2 分

后缀表达式"6 2 3 + - 3 8 2 / + * 2 ^ 3 +"对应的中缀表达式是()。

  • A.

    ((6 - (2 + 3))* (3 + 8 / 2))^ 2 +3

  • B.

    6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3

  • C.

    (6- (2 + 3))* ((3 + 8 / 2))^ 2) + 3

  • D.

    6 -((2 + 3)*(3 + 8 / 2))^ 2 + 3

A

B

C

D

9.【 单选 】2 分

数101010(2)和166(8)的和为()。

  • A.

    10110000(2)

  • B.

    236(8)

  • C.

    158(10)

  • D.

    A0(16)

A

B

C

D

10.【 单选 】2 分

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

  • A.

    1111,1110,101,100,110,0

  • B.

    1010,1001,1000,011,010,00

  • C.

    000,001,010,011,10,11

  • D.

    1010,1011,110,111,00 ,01

A

B

C

D

11.【 单选 】2 分

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

  • A.

    EDBGFCA

  • B.

    EDGBFCA

  • C.

    DEBGFCA

  • D.

    DBEGFCA

A

B

C

D

12.【 单选 】2 分

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

  • A.

    4,2,3,1

  • B.

    1,2,3,4

  • C.

    1,2,4,3

  • D.

    2,1,3,4

A

B

C

D

13.【 单选 】2 分

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

  • A.

    字节(byte)

  • B.

    比特(bit)

  • C.

    字(word)

  • D.

    千字节(kilobyte)

A

B

C

D

14.【 单选 】2 分

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

  • A.

    1420

  • B.

    1770

  • C.

    1540

  • D.

    2200

A

B

C

D

15.【 单选 】2 分

以下哪个不是操作系统?()

  • A.

    Linux

  • B.

    Windows

  • C.

    Android

  • D.

    HTML

A

B

C

D

16.【 单选 】2 分

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

(1)

01#include <iostream>
02#include <cmath>
03using namespace std;
04
05double f(double a,double b,double c){
06	double s=(a+b+c)/2;
07	return sqrt(s*(s-a)*(s-b)*(s-c));
08} 
09
10int main(){
11	cout.flags(ios::fixed);
12	cout.precision(4);
13	
14	int a,b,c;
15	cin>>a>>b>>c;
16	cout<<f(a,b,c)<<endl;
17	return 0;
18}

假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题。

(2分)当输入为“2 2 2”时,输出为“1.7321”。

  • A.

    正确

  • B.

    错误

A

B

17.【 单选 】2 分

(2分)将第7行中的“(s-b)*(s-c)”改为“(s-c)*(s-b)”不会影响程序运行的结果 

  • A.

    正确

  • B.

    错误

A

B

18.【 单选 】2 分

(2分)程序总是输出四位小数。

  • A.

    正确

  • B.

    错误

A

B

19.【 单选 】3 分

单选题

当输入为“3 4 5”时,输出( )

  • A.

    “6.0000”

  • B.

    “12.0000”

  • C.

    “24.0000”

  • D.

    “30.0000”

A

B

C

D

20.【 单选 】3 分

当输入为“5 12 13”时,输出为( )

  • A.

    “24.0000”

  • B.

    “30.0000”

  • C.

    “60.0000”

  • D.

    “120.0000”

A

B

C

D

21.【 单选 】1.5 分

(2)

01#include <iostream>
02#include <vector>
03#include <algorithm>
04using namespace std;
05
06int f(string x,string y){
07	int m=x.size();
08	int n=y.size();
09	vector<vector<int>> v(m+1, vector<int>(n+1,0));
10	for(int i=1;i<=m;i++){
11		for(int j=1;j<=n;j++){
12			if(x[i-1]==y[j-1]){
13				v[i][j]=v[i-1][j-1]+1;
14			}else{
15				v[i][j]=max(v[i-1][j],v[i][j-1]);
16			}
17		}
18	}
19	return v[m][n];
20}
21
22bool g(string x,string y){
23	if(x.size()!=y.size()){
24		return false;
25	}
26	return f(x+x,y)==y.size();
27}
28
29int main(){
30	string x,y;
31	cin>>x>>y;
32	cout<<g(x,y)<<endl;
33	return 0;
34}

判断题

f函数的返回值小于等于min(n,m)。

  • A.

    正确

  • B.

    错误

A

B

22.【 单选 】1.5 分

f函数的返回值等于两个输入字符串的最长公共子串的长度。

  • A.

    正确

  • B.

    错误

A

B

23.【 单选 】1.5 分

当输入两个完全相同的字符串时,g函数的返回值总是true。

  • A.

    正确

  • B.

    错误

A

B

24.【 单选 】3 分

单选题

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

  • A.

    行为不变

  • B.

    只会改变输出

  • C.

    一定非正常退出

  • D.

    可能非正常退出

A

B

C

D

25.【 单选 】3 分

当输入为“csp-j p-jcs”时,输出为( )

  • A.

    “0”

  • B.

    “1”

  • C.

    “T”

  • D.

    “F”

A

B

C

D

26.【 单选 】3 分

当输入为“csppsc spsccp” 时,输出为( )

  • A.

    “T”

  • B.

    “F”

  • C.

    “0”

  • D.

    “1”

A

B

C

D

27.【 单选 】1.5 分

(3)

01#include <iostream>
02#include <cmath>
03using namespace std;
04
05int solve1(int n){
06	return n*n;
07}
08
09int solve2(int n){
10	int sum=0;
11	for(int i=1;i<=sqrt(n);i++){
12		if(n%i==0){
13			if(n/i==i){
14				sum+=i*i;
15			}else{
16				sum+=i*i+(n/i)*(n/i);
17			}
18		}
19	}
20	return sum;
21}
22
23int main(){
24	int n;
25	cin>>n;
26	cout<<solve2(solve1(n))<<" "<<solve1(solve2(n))<<endl;
27	return 0;
28}

假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。

判断题

如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和。

  • A.

    正确

  • B.

    错误

A

B

28.【 单选 】1.5 分

第13-14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次。

  • A.

    正确

  • B.

    错误

A

B

29.【 单选 】1.5 分

如果输入的n为质数,solve2(n)的返回值为n^2+1。

  • A.

    正确

  • B.

    错误

A

B

30.【 单选 】4 分

单选题

(4分)如果输入的n为质数p的平方,那么solve2(n)的返回值为( )

  • A.

    p^2+p+1

  • B.

    n^2+n+1

  • C.

    n^2+1

  • D.

    p^4+2*p^2+1

A

B

C

D

31.【 单选 】3 分

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

  • A.

    大于0

  • B.

    大于等于0且不一定大于0

  • C.

    小于0

  • D.

    小于等于0且不一定小于0

A

B

C

D

32.【 单选 】3 分

当输入为“5”时,输出为( )

  • A.

    “651 625”

  • B.

    “650 729”

  • C.

    “651 676”

  • D.

    “652 625”

A

B

C

D

33.【 单选 】3 分

(寻找被移除的元素)问题:原有长度为n+1、公差为1的等差升序数列,将数列输入到程序的数组时移除了一个元素,导致长度为n的升序数组可能不再连续,除非被移除的是第一个或最后一个元素,需要在数组不连续时,找出被移除的元素。

试补全程序

01 #include<iostream>
02 #include<vector>
03
04 using namespace std;
05 
06 int find_missing(vector<int>& nums){
07 	 int left=0,right=nums.size()-1;
08 	 while(left<right){
09		 int mid=left+(right-left)/2;
10		 if(nums[mid]==mid+ ①){
11			②; 
12		 }else{
13			③; 
14		 }
15	 }
16	 return ④; 
17 }
18
19 int main(){
20	 int n;
21	 cin>>n;
22	 vector<int> nums(n);
23	 for(int i=0;i<n;i++) cin>>nums[i];
24	 int missing_number=find_missing(nums);
25	 if(missing_number == ⑤){
26		 cout<<"Sequence is consecutive"<<endl; 
27 	 }else{
28		 cout<<"Missing number is "<<missing_number<<endl;
29	 }
30	 return 0;
31 }

①处应该填()

  • A.

    1

  • B.

    nums[0]

  • C.

    right

  • D.

    left

A

B

C

D

34.【 单选 】3 分

②处应该填()

  • A.

    left=mid+1

  • B.

    right=mid-1

  • C.

    right=mid

  • D.

    left=mid

A

B

C

D

35.【 单选 】3 分

③处应该填()

  • A.

    left=mid+1

  • B.

    right=mid-1

  • C.

    right=mid

  • D.

    left=mid

A

B

C

D

36.【 单选 】3 分

④处应该填()

  • A.

    left+nums[0]

  • B.

    right+nums[0]

  • C.

    mid+nums[0]

  • D.

    right+1

A

B

C

D

37.【 单选 】3 分

⑤处应该填()

  • A.

    nums[0]+n

  • B.

    nums[0]+n-1

  • C.

    nums[0]+n+1

  • D.

    nums[n-1]

A

B

C

D

38.【 单选 】3 分

(编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace)一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
试补全动态规划算法。

01 #include<iostream>
02 #include<string>
03 #include<vector> 
04 using namespace std;
05
06 int min(int x,int y,int z){
07 	  return min(min(x, y), z);
08 }
09
10 int edit_dist_dp(string str1,string str2){
11	  int m = str1.length();
12	  int n = str2.length();
13	  vector<vector<int>> dp(m + 1, vector<int>(n + 1));
14	
15	  for(int i = 0; i <= m; i++) {
16		  for(int j = 0; j <= n; j++) {
17			if (i == 0)
18				dp[i][j] = ①;
19			else if (j == 0)
20				dp[i][j] = ②;
21			else if(③)
22				dp[i][j] =  ④;
23			else 
24				dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤); 
25		  }
26	  }
27	  return dp[m][n];
28 }
29
30 int main(){
31	  string str1,str2;
32	  cin >> str1 >> str2;
33	  cout << "Minimum number of operations: "
34		    << edit_dist_dp(str1, str2) << endl;
35	  return 0;
36 }

①处应填(     )

  • A.

    j

  • B.

    i

  • C.

    m

  • D.

    n

A

B

C

D

39.【 单选 】3 分

②处应填(     )

  • A.

    j

  • B.

    i

  • C.

    m

  • D.

    n

A

B

C

D

40.【 单选 】3 分

③处应填(     )

  • A.

    str1[i - 1] == str2[j - 1]

  • B.

    str1[i] == str2[j]

  • C.

    str1[i - 1] != str2[j - 1]

  • D.

    str1[i] != str2[j]

A

B

C

D

41.【 单选 】3 分

④处应填(     )

  • A.

    dp[i - 1][j - 1] + 1

  • B.

    dp[i - 1][j - 1]

  • C.

    dp[i - 1][j]

  • D.

    dp[i][j - 1]

A

B

C

D

42.【 单选 】3 分

⑤处应填(     )

  • A.

    dp[i][j] + 1

  • B.

    dp[i - 1][j - 1] + 1

  • C.

    dp[i - 1][j - 1]

  • D.

    dp[i][j]

A

B

C

D

现在向大家征求答案,评论区留下!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值