【CSP初赛】程序阅读3

前置知识

埃氏筛素数、C++ 基础。

阅读程序

#include <bits/stdc++.h>
using namespace std;
int main(){
	int a1[51] = {0};
	int i,j,t,t2,n = 50;
	for(i = 2;i<=sqrt(n);i++)
	{
		if(a1[i] == 0)
		{
			t2 = n/i;
			for(j = 2;j<=t2;j++) a1[i*j] = 1;
		}
	}
	t = 0;
	for(i = 2;i<=n;i++)
	{
		if(a1[i] == 0)
		{
			cout <<" "<<i;
			t++;
			if(t%10 == 0) cout << endl;
		}
	}
	cout << endl;
	return 0;
}

判断

1) 若把 05 05 05 行 n 改为 51 51 51,程序可能发生运行时错误。()

2) 若去掉第 04 04 04 行的 "={0}" \text{"=\{0\}"} "={0}",则程序运行结果不会改变。()

3) 这个程序输出了 16 16 16 个数字。()

4) 输出的第 11 11 11 个数为 31 31 31。()

选择

5)程序的时间复杂度为( )

A O ( 1 ) \text{O}(1) O(1) B O ( n ) \text{O}(n) O(n) C O ( n log ⁡ n ) \text{O}(n \log n) O(nlogn) D O ( n log ⁡ log ⁡ n ) \text{O}(n \log \log n) O(nloglogn)

6)输出的第 14 14 14 个数为( )

A. 41 41 41 B. 42 42 42 C. 43 43 43 D. 44 44 44

答案解析

首先分析程序:程序使用埃氏筛素数的方法筛出了 50 50 50 以内的所有素数,同时以每行 10 10 10 个的方法进行输出。

判断

1)对

因为 a a a 数组的大小为 51 51 51,C++ 规定数组只能访问到 数组长度 − 1 \text{数组长度}-1 数组长度1 的下标位置,访问 a[51] 时会出现下标越界的情况。

2)错

int a[51]={0} 是一种初始化方法,因为在 main 函数中定义的所有变量(包括数组)内的初始值是不确定的={0} 表示把数组内的元素全部初始化为 0 0 0(此操作也可以用 memset 实现)。如果去掉的话会影响运行结果。

3)错

50 50 50 以内的质数只有以下 15 15 15 个: 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47

题目说输出了 16 16 16 个数字,所以是错误的。

4)对

如上题打的表所示,第 11 11 11 个质数就是 31 31 31

选择

5)D

常识题,埃氏筛找出 n n n 以内的素数的时间复杂度为 O ( n log ⁡ log ⁡ n ) \text{O}(n \log \log n) O(nloglogn)

普通筛质数的复杂度为 O ( n ) \text{O}(n) O(n),优化后可达 O ( n ) \text{O}(\sqrt n) O(n )

线性筛法找出前 n n n 个素数的的时间复杂度为 O ( n ) \text{O}(n) O(n)

6)C

根据第 4 4 4 题打的表,第 14 14 14 个数是 43 43 43,所以选 C。

总结

以上为【CSP初赛练习】程序阅读3 的习题解析,希望大家喜欢!

想要复制保存参见 Markdown 源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值