文章目錄
- 前置知識
- 閱讀程序
- 判斷
- 選擇
- 答案解析
- 判斷
- 選擇
- 總結
前置知識
埃氏篩素數、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(nlog?n)\text{O}(n \log n)O(nlogn) D O(nlog?log?n)\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(nlog?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?);
線性篩法找出前 nnn 個素數的的時間復雜度為 O(n)\text{O}(n)O(n)。
6)C
根據第 444 題打的表,第 141414 個數是 434343,所以選 C。
總結
以上為【CSP初賽練習】程序閱讀3 的習題解析,希望大家喜歡!
想要復制保存參見 Markdown 源代碼。