2022CSP阅读程序真题附解析

       

假设输入的 x 、 y 均是不超过 15 的自然数,完成下面的判断题和单选题:
判断题
16. 删去第 7 行与第 13 行的 unsigned ,程序行为不变。( )
17. 将第 7 行与第 13 行的 short 均改为 char ,程序行为不变。( )
18. 程序总是输出一个整数“ 0 ”。( )
19. 当输入为“ 2 2 ”时,输出为“ 10 ”。( )
20. 当输入为“ 2 2 ”时,输出为“ 59 ”。( )
单选题
21. 当输入为“ 13 8 ”时,输出为( )。
A. “ 0 ”
B. “ 209 ”
C. “ 197 ”
D. “ 226 ”

16.【答案】对【解析】本程序考查位运算的知识点。unsigned short 表示无 符号短整型,数据范围为 0 ~ 65535,占 2 个字节。| 为按位或运 算,& 为按位与运算,<< 为左移运算。需要注意的是 << 运算优 先级高于 |。0x33 表示 十六进制的33,即十进制的510x55 表示十六机制的 55,即十进制的85

17、【答案】 ×【解析】输入为不超过 15 的自然数,改为 char 以 后,当输入为两位数时,x,y 分别读入的是第一个数的十位和个位, 改变了程序的行为和结果。

18、【答案】 ×【解析】略

19、【答案】 ×【解析】代入"2 2",输出结果为"12"。

20、【答案】×【解析】略

21、【答案】B【解析】代入"13 8",输出结果为"209"

#include <algorithm>
#include <iostream>
#include <limits>

using namespace std;

const int MAXN=105;
const int MAXK=105;
int h[MAXN][MAXK];

int f(int n,int m)
{
	if(m==1) return n;
	if(n==0) return 0;
	
	int ret=numeric_limits<int>::max();
	for(int i=1;i<=n;i++)
		ret=min(ret,max(f(n-i,m),f(i-1,m-1))+1);
	return ret;    
}

int g(int n,int m)
{
	for(int i=1;i<=n;i++) 
		h[i][1]=i;
	for(int j=1;j<=m;j++)
		h[0][j]=0;
		
	for(int i=1;i<=n;i++){
		for(int j=2;j<=m;j++){
			 h[i][j]=numeric_limits<int>::max();
			 for(int k=1;k<=i;k++)
			 h[i][j]=min(
			 	h[i][j],
			 	max(h[i-k][j],h[i-1][j-1])+1);
		}
	}
	
	return h[n][m];
}

int main()
{
	int n,m;
	cin>>n>>m;
	cout<<f(n,m)<<endl<<g[n,m]<<endl;
	return 0;
}

假设输入的 n 、 m 均是不超过 100 的正整数,完成下面的判断题和单选题:
判断题
22. 当输入为“ 7 3 ”时,第 19 行用来取最小值的 min 函数执行了 449 次。( )
23. 输出的两行整数总是相同的。( )
24. 当 m 为 1 时,输出的第一行总为 n 。( )
单选题
25. 算法 g(n,m) 最为准确的时间复杂度分析结果为( )。
A. O ( n 3 2 / 𝑚 ) O(n^{\frac{3}{2}}/𝑚)O(n23​/m)
B. O ( n m ) O(nm)O(nm)
C. O ( n 2 m ) O(n^2m)O(n2m)
D. O ( n m 2 ) O(nm^2)O(nm2)
26. 当输入为“ 20 2 ”时,输出的第一行为( )。
A. “ 4 ”
B. “ 5 ”
C. “ 6 ”
D. “ 20 ”
27. (4 分) 当输入为“ 100 100 ”时,输出的第一行为( )。
A. “ 6 ”
B. “ 7 ”
C. “ 8 ”
D. “ 9 ”

22、【答案】×【解析】代入模拟计算,共执行了 448 次。亦可通 过递推式根据奇偶性快速判断。

23、【答案】√【解析】两个函数的计算结果是一样的。

24、【答案】√【解析】代入 f 函数,当 m == 1 时,计算结果为 n。

25、【答案】C【解析】i = 1 时,内层两重循环重复 (m-1)次;i = 2 时,内层两重循环重复 2(m-1)次;……i = n 时,内层两重循环重复 n(m-1)次;累加求和,可得∑i(m-1) = n(n+1)(m+1)/2,时间复杂 度为 O()。

26、【答案】C【解析】代入模拟,可以发现 m=2 时,列举出 n 为 1~20 的计算结果为 1 个 1,2 个 2,3 个 3,4 个 4,5 个 5,5 个 6, 因此结果为 6。

27、【答案】B【解析】代入模拟,先计算出 m=1,m=2,m=3 的情况,找出规律,可以发现当 m = 100 的时候,列举出 n 从 1~100 的结果,为 1 个 1,2 个 2,4 个 3,8 个 4,16 个 5,32 个 6,37 个 7,因此结果为 7。

01 #include <iostream>
02
03 using namespace std;
04
05 int n, k;
06
07 int solve1()
08 {
09     int l = 0, r = n;
10     while (l <= r) {
11         int mid = (l + r) / 2;
12         if (mid * mid <= n) l = mid + 1;
13         else r = mid - 1;
14     }
15     return l - 1;
16 }
17
18 double solve2(double x)
19 {
20     if (x == 0) return x;
21     for (int i = 0; i < k; i++)
22         x = (x + n / x) / 2;
23     return x;
24 }
25
26 int main()
27 {
28     cin >> n >> k;
29     double ans = solve2(solve1());
30     cout << ans << ' ' << (ans * ans == n) << endl;
31     return 0;
32 }

假设 int 为 32 位有符号整数类型,输入的 n 是不超过 47000 的自然数、 k 是不超过 int 表示范围的自然数,完成下面的判断题和单选题:
判断题
28. 该算法最准确的时间复杂度分析结果为 𝑂(log 𝑛 + 𝑘) 。( )
29. 当输入为“ 9801 1 ”时,输出的第一个数为“ 99 ”。( )
30. 对于任意输入的 n ,随着所输入 k 的增大,输出的第二个数会变成“ 1 ”。( )
31. 该程序有存在缺陷。当输入的 n 过大时,第 12 行的乘法有可能溢出,因此应当将mid 强制转换为 64 位整数再计算。( )
单选题
32. 当输入为“ 2 1 ”时,输出的第一个数最接近( )。
A. 1
B. 1.414
C. 1.5
D. 2
33. 当输入为“ 3 10 ”时,输出的第一个数最接近( )。
A. 1.7
B. 1.732
C. 1.75
D. 2
34. 当输入为“ 256 11 ”时,输出的第一个数( )。
A. 等于 16
B. 接近但小于 16
C. 接近但大于 16
D. 前三种情况都有可能

28、【答案】√【解析】solve1 函数是二分 O(logn),solve2 函数 是 O(k),都只执行一次,是 O(logn + k)。

29、【答案】√【解析】9801 = 99 × 99,算术平方根为 99。

30、【答案】√【解析】9801 = 99 × 99,算术平方根为 99。

31、【答案】×【解析】n <= 47000, mid <= n/2 <= 23500, mid * mid <= 552,250,000,不会溢出。

32、【答案】C【解析】代入计算,solve1 函数的计算结果为 1,solve2 函数的计算结果为 1.5。

33、【答案】B【解析】√3 = 1.732…,k=10,迭代次数越多精度 越高,因此接近 B。 

34、【答案】A【解析】256 = 16 × 16,输出的第一个数等于16。

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值