文章目录
- 前置知识
- 阅读程序
- 判断
- 选择
- 答案解析
- 判断
- 选择
- 总结
前置知识
埃氏筛素数、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) 若把 050505 行 n 改为 515151,程序可能发生运行时错误。()
2) 若去掉第 040404 行的 "={0}"\text{"=\{0\}"}"={0}",则程序运行结果不会改变。()
3) 这个程序输出了 161616 个数字。()
4) 输出的第 111111 个数为 313131。()
选择
5)程序的时间复杂度为( )
A O(1)\text{O}(1)O(1) B O(n)\text{O}(n)O(n) C O(nlogn)\text{O}(n \log n)O(nlogn) D O(nloglogn)\text{O}(n \log \log n)O(nloglogn)
6)输出的第 141414 个数为( )
A.414141 B.424242 C.434343 D.444444
答案解析
首先分析程序:程序使用埃氏筛素数的方法筛出了 505050 以内的所有素数,同时以每行 101010 个的方法进行输出。
判断
1)对
因为 aaa 数组的大小为 515151,C++ 规定数组只能访问到 数组长度−1\text{数组长度}-1数组长度−1 的下标位置,访问 a[51]
时会出现下标越界的情况。
2)错
int a[51]={0}
是一种初始化方法,因为在 main 函数中定义的所有变量(包括数组)内的初始值是不确定的,={0}
表示把数组内的元素全部初始化为 000(此操作也可以用 memset
实现)。如果去掉的话会影响运行结果。
3)错
505050 以内的质数只有以下 151515 个:2,3,5,7,11,13,17,19,23,29,31,37,41,43,472, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 472,3,5,7,11,13,17,19,23,29,31,37,41,43,47
题目说输出了 161616 个数字,所以是错误的。
4)对
如上题打的表所示,第 111111 个质数就是 313131。
选择
5)D
常识题,埃氏筛找出 nnn 以内的素数的时间复杂度为 O(nloglogn)\text{O}(n \log \log n)O(nloglogn);
普通筛质数的复杂度为 O(n)\text{O}(n)O(n),优化后可达 O(n)\text{O}(\sqrt n)O(n);
线性筛法找出前 nnn 个素数的的时间复杂度为 O(n)\text{O}(n)O(n)。
6)C
根据第 444 题打的表,第 141414 个数是 434343,所以选 C。
总结
以上为【CSP初赛练习】程序阅读3 的习题解析,希望大家喜欢!
想要复制保存参见 Markdown 源代码。