前置知识
埃氏筛素数、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 源代码。