林老师 · 客观题题库 · CSP-J 卷

CSP-J 卷

埃氏筛/欧拉筛/质数判定/约数个数/数论基础 · 共 41 题 · 由简到难 · 建议 62 分钟
真题
复刻
试卷编号OBJ-945372
题目总数41 题 · 82 分
试卷类型客观题
考生须知:
① 本卷为客观题单卷,合计 41 题 · 82 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 82 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

客 观 题

41 QUESTIONS · 2 POINTS EACH
第 1 题 单选 未作答

某个整数很长很长,形如:1232123212321……,其规律是从 1 开始逐一升高到 3 然后逐一降低到 1,然后又逐一升高到 3,一直到很长很长。假设最高位编号为 1,要求判断从左边最高位开始的第 NN 位数是几?在横线处应该填入的代码是( )。

01int N, M;
02cout << "请输入编号:";
03cin >> N;
04M = ____________;
05if (M != 0)
06    cout << M;
07else
08    cout << 2;

(2 分)
GESP 一级 2025-12 · 单选 第8题 | 知识点 程序补全、同余与模运算、if-else
第 2 题 单选 未作答

100100 以内最大的素数是( )。

(2 分)
CSP-J 2019 · 单选 第9题 | 知识点 质数判定、初等代数
第 3 题 单选 未作答

319319377377 的最大公约数是( )。

(2 分)
CSP-J 2019 · 单选 第10题 | 知识点 最大公约数、质因数分解
第 4 题 单选 未作答

下面 C++ 代码用于判断 N(大于等于 2 的正整数)是否为质数(素数)。下面对如下代码的说法,正确的是( )。

01cin >> N;
02for (i = 2; i < N / 2; i++)
03    if (N % i == 0) {
04        cout << N << "不是质数";
05        break;
06    }
07if (i >= N / 2)
08    cout << N << "是质数";

(2 分)
GESP 二级 2023-12 · 单选 第5题 | 知识点 程序阅读与输出推断、质数判定、for循环、break与continue
第 5 题 单选 未作答

阅读下面的 C++ 代码,其中变量都是整型,则说法正确的是( )。

01cin >> a >> b;
02while (b != 0){
03    remainder = a % b;
04    a = b;
05    b = remainder;
06}
07cout << a;

(2 分)
GESP 二级 2025-09 · 单选 第9题 | 知识点 最大公约数、while循环
第 6 题 判断 未作答

闰年的定义:

  • 普通闰年:公历年份是 44 的倍数,且不是 100100 的倍数的,为闰年(如 20042004 年、20202020 年等就是闰年)。
  • 世纪闰年:公历年份是整百数的,必须是 400400 的倍数才是闰年(如 19001900 年不是闰年,20002000 年是闰年)。

下面程序是判断是否是闰年的正确程序。

01cin >> n;
02cout << ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0) ? 1 : 0);
03return 0;

(2 分)
GESP 三级 2025-03 · 判断 第3题 | 知识点 逻辑运算、同余与模运算、程序阅读与输出推断
第 7 题 单选 未作答

以下 C++ 代码用于实现每个整数对应的因数,如输入 1212,则输出 1 2 3 4 6 12;如输入 1818,则输出 1 2 3 6 9 18。横线处应填入代码是( )。

01int n;
02cin>>n;
03for(int i=1;i<=n;i++)
04{
05    ____________
06    {
07        cout<<i<<" ";
08    }
09}

(2 分)
GESP 四级 2023-12 · 单选 第12题 | 知识点 程序补全、约数个数
第 8 题 单选 未作答

输入 11 个正整数 NNN7N \geq 7),想找出它所有相邻的因数对,如,输入 1212,因数对有 (1,2)(1,2)(2,3)(2,3)(3,4)(3,4)。下面哪段代码找不到所有的因数对?( )。

(2 分)
GESP 四级 2023-12 · 单选 第15题 | 知识点 程序阅读与输出推断、约数个数
第 9 题 判断 未作答

质数的判定和筛法的目的并不相同,质数判定旨在判断特定的正整数是否为质数,而质数筛法意在筛选出范围内的所有质数。

(2 分)
GESP 五级 2023-09 · 判断 第9题 | 知识点 质数判定、埃氏筛
第 10 题 单选 未作答

素数的线性筛法时间复杂度为( )。

(2 分)
GESP 五级 2024-03 · 单选 第11题 | 知识点 欧拉筛、时间复杂度
第 11 题 单选 未作答

唯一分解定理描述了关于正整数的什么性质?

(2 分)
GESP 五级 2025-06 · 单选 第8题 | 知识点 质因数分解
第 12 题 单选 未作答

干支纪年法是中国传统的纪年方法,由 1010 个天干和 1212 个地支组合成 6060 个天干地支。由公历年份可以根据以下公式和表格换算出对应的天干地支。

天干=(公历年份)除以 1010 所得余数

地支=(公历年份)除以 1212 所得余数

例如,今年是 20202020 年,20202020 除以 1010 余数为 00,查表为“庚”;20202020 除以 1212,余数为 44,查表为“子”,所以今年是庚子年。

请问 19491949 年的天干地支是( )。

(2 分)
CSP-J 2020 · 单选 第13题 | 知识点 同余与模运算、最小公倍数
第 13 题 判断 未作答

小杨想写一个程序来算出正整数 N 有多少个因数,经过思考他写出了一个重复没有超过 N/2 次的循环就能够算出来了。

(2 分)
GESP 五级 2023-12 · 判断 第9题 | 知识点 约数个数
第 14 题 判断 未作答

找出自然数 NN 以内的所有质数,常用算法有埃氏筛法和线性筛法,其中埃氏筛法效率更高。

(2 分)
GESP 五级 2023-09 · 判断 第3题 | 知识点 欧拉筛、埃氏筛
第 15 题 判断 未作答

素数表的埃氏筛法和线性筛法的时间复杂度都是 O(NloglogN)O(N \log \log N)

(2 分)
GESP 五级 2024-03 · 判断 第7题 | 知识点 埃氏筛、欧拉筛、时间复杂度
第 16 题 判断 未作答

在求解所有不大于 nn 的素数时,线性筛法(欧拉筛)都应当优先于埃氏筛法使用,因为线性筛法的时间复杂度为 O(n)O(n),低于埃氏筛法的 O(nloglogn)O(n \log \log n)

(2 分)
GESP 五级 2025-12 · 判断 第4题 | 知识点 欧拉筛、埃氏筛
第 17 题 单选 未作答

下面的代码用于判断整数 nn 是否是质数,错误的说法是( )。

01bool is_prime(int n) {
02    if (n <= 1) return false;
03
04    int finish_number = static_cast<int>(sqrt(n)) + 1;
05    for (int i = 2; i < finish_number; ++i) {
06        if (n % i == 0)
07            return false;
08    }
09    return true;
10}

(2 分)
GESP 五级 2025-06 · 单选 第7题 | 知识点 质数判定、埃氏筛、欧拉筛
第 18 题 单选 未作答

关于埃氏筛和线性筛的比较,下列说法错误的是( )。

(2 分)
GESP 五级 2025-09 · 单选 第8题 | 知识点 埃氏筛、欧拉筛
第 19 题 单选 未作答

埃氏筛中将内层循环从 j = i*i 开始而不是 j = 2*i 的主要原因是( )。

01vector<int> eratosthenes_sieve(int n) {
02    vector<bool> is_composite(n + 1, false);
03    vector<int>  primes;
04    for (int i = 2; i <= n; i++) {
05        if (is_composite[i]) continue;
06        primes.push_back(i);
07        for (long long j = (long long)i * i; j <= n; j += i)
08            is_composite[j] = true;
09    }
10    return primes;
11}

(2 分)
GESP 五级 2026-03 · 单选 第6题 | 知识点 埃氏筛、欧拉筛
第 20 题 单选 未作答

下面关于埃氏筛法的说法正确的是( )。

(2 分)
GESP 五级 2026-06 · 单选 第6题 | 知识点 埃氏筛、欧拉筛
第 21 题 单选 未作答

下述代码实现素数表的埃拉托斯特尼筛法,筛选出所有小于等于 n 的素数,则横线上应填的最佳代码是( )。

01void sieve_Eratosthenes(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i * i <= n; i++) {
06        if (is_prime[i]) {
07            primes.push_back(i);
08            ____________ {   // 在此处填入代码
09                is_prime[j] = false;
10            }
11        }
12    }
13
14    for (int i = sqrt(n) + 1; i <= n; i++) {
15        if (is_prime[i]) {
16            primes.push_back(i);
17        }
18    }
19
20    return primes;
21}

(2 分)
GESP 五级 2024-09 · 单选 第5题 | 知识点 埃氏筛、程序补全
第 22 题 单选 未作答

下述代码实现素数表的线性筛法,筛选出所有小于等于 n 的素数,则横线上应填的代码是( )。

01vector<int> sieve_linear(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i <= n / 2; i++) {
06        if (is_prime[i])
07            primes.push_back(i);
08            ____________ {   // 在此处填入代码
09                is_prime[i * primes[j]] = 0;
10                if (i % primes[j] == 0)
11                    break;
12            }
13    }
14
15    for (int i = n / 2 + 1; i <= n; i++) {
16        if (is_prime[i])
17            primes.push_back(i);
18    }
19
20    return primes;
21}

(2 分)
GESP 五级 2024-09 · 单选 第6题 | 知识点 欧拉筛、程序补全
第 23 题 单选 未作答

下述代码实现素数表的埃拉托色尼(埃氏)筛法,筛选出所有小于等于 nn 的素数。下面说法正确的是( )。

01vector<int> sieve_Eratosthenes(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i * i <= n; i++) {
06        if (is_prime[i]) {
07            primes.push_back(i);
08
09            for (int j = i * i; j <= n; j += i) {
10                is_prime[j] = false;
11            }
12        }
13    }
14
15    for (int i = sqrt(n) + 1; i <= n; i++) {
16        if (is_prime[i]) {
17            primes.push_back(i);
18        }
19    }
20
21    return primes;
22}

(2 分)
GESP 五级 2024-12 · 单选 第7题 | 知识点 埃氏筛、时间复杂度
第 24 题 单选 未作答

下述代码实现素数表的线性筛法,筛选出所有小于等于 nn 的素数。下面说法正确的是( )。

01vector<int> sieve_linear(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i <= n/2; i++) {
06        if (is_prime[i])
07            primes.push_back(i);
08
09            for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
10                is_prime[ i * primes[j] ] = 0;
11                if (i % primes[j] == 0)
12                    break;
13            }
14    }
15
16    for (int i = n/2 +1; i <= n; i++) {
17        if (is_prime[i])
18            primes.push_back(i);
19    }
20
21    return primes;
22}

(2 分)
GESP 五级 2024-12 · 单选 第8题 | 知识点 欧拉筛、时间复杂度
第 25 题 单选 未作答

下述代码实现素数表的线性筛法,筛选出所有小于等于 n 的素数,横线上应填的最佳代码是( )。

01vector<int> sieve_linear(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04    if (n < 2) return primes;
05    is_prime[0] = is_prime[1] = false;
06    for (int i = 2; i <= n / 2; i++) {
07        if (is_prime[i])
08            primes.push_back(i);
09        for (int j = 0; ____________ ; j++) {   // 在此处填入代码
10            is_prime[i * primes[j]] = false;
11            if (i % primes[j] == 0)
12                break;
13        }
14    }
15    for (int i = n / 2 + 1; i <= n; i++) {
16        if (is_prime[i])
17            primes.push_back(i);
18    }
19    return primes;
20}

(2 分)
GESP 五级 2025-03 · 单选 第6题 | 知识点 欧拉筛、程序补全
第 26 题 判断 未作答

如下为线性筛法,用于高效生成素数表,其核心思想是每个合数只被它的最小质因数筛掉一次,时间复杂度为 O(n)O(n)

01vector<int> linearSieve(int n) {
02    vector<bool> is_prime(n + 1, true);
03    vector<int> primes;
04
05    for (int i = 2; i <= n; ++i) {
06        if (is_prime[i]) {
07            primes.push_back(i);
08        }
09
10        for (int j = 0; j < primes.size() && i * primes[j] <= n; ++j) {
11            is_prime[i * primes[j]] = false;
12            if (i % primes[j] == 0) {
13                break;
14            }
15        }
16    }
17    return primes;
18}

(2 分)
GESP 五级 2025-06 · 判断 第10题 | 知识点 欧拉筛、时间复杂度
第 27 题 单选 未作答

函数 sieve 实现埃拉托斯特尼筛法(埃氏筛),横线处应填入( )。

01vector<bool> sieve(int n) {
02    vector<bool> is_prime(n+1, true);
03    is_prime[0] = is_prime[1] = false;
04    for(int i = 2; i <= n; i++) {
05        if(is_prime[i]) {
06            for(int j = ____________; j <= n; j += i) {
07                is_prime[j] = false;
08            }
09        }
10    }
11    return is_prime;
12}

(2 分)
GESP 五级 2025-09 · 单选 第6题 | 知识点 埃氏筛、程序补全
第 28 题 单选 未作答

函数 linearSieve 实现线性筛法(欧拉筛),横线处应填入( )。

01vector<int> linearSieve(int n) {
02    vector<bool> is_prime(n+1, true);
03    vector<int> primes;
04    for(int i = 2; i <= n; i++) {
05        if(is_prime[i]) primes.push_back(i);
06        for(int p : primes) {
07            if(p * i > n) break;
08            is_prime[p * i] = false;
09            if(____________) break;
10        }
11    }
12    return primes;
13}

(2 分)
GESP 五级 2025-09 · 单选 第7题 | 知识点 欧拉筛、程序补全
第 29 题 判断 未作答

线性筛关键是“每个合数只会被最小质因子筛到一次”,因此为 O(n)O(n)

(2 分)
GESP 五级 2025-09 · 判断 第6题 | 知识点 欧拉筛、时间复杂度
第 30 题 单选 未作答

下面代码实现了欧拉(线性)筛,横线处应填写( )。

01vector<int> euler_sieve(int n) {
02    vector<bool> is_composite(n + 1, false);
03    vector<int>  primes;
04    for (int i = 2; i <= n; i++) {
05        if (!is_composite[i])
06            primes.push_back(i);
07        for (int j = 0; ____________ && (long long)i * primes[j] <= n; j++) {
08            is_composite[i * primes[j]] = true;
09            if (i % primes[j] == 0)
10                break;
11        }
12    }
13    return primes;
14}

(2 分)
GESP 五级 2026-03 · 单选 第5题 | 知识点 欧拉筛、程序补全
第 31 题 判断 未作答

线性筛相比埃氏筛的核心改进在于:埃氏筛中一个合数可能被多个质数重复标记,线性筛通过"每个合数只被其最大质因子筛去"的策略,保证每个合数恰好被标记一次,从而实现 O(n)O(n) 的时间复杂度。

(2 分)
GESP 五级 2026-03 · 判断 第9题 | 知识点 欧拉筛、埃氏筛
第 32 题 判断 未作答

假设函数 gcd() 函数能正确求两个正整数的最大公约数,则下面的 lcm(a, b) 函数能正确找到两个正整数 aabb 的最小公倍数。

01int lcm(int a, int b) {
02    return a / gcd(a, b) * b;
03}

(2 分)
GESP 五级 2025-12 · 判断 第2题 | 知识点 最大公约数、最小公倍数
第 33 题 单选 未作答

线性筛法与埃氏筛法相比的优势是( )。

(2 分)
GESP 六级 2024-03 · 单选 第13题 | 知识点 欧拉筛、埃氏筛
第 34 题 判断 未作答

埃氏筛法和欧拉筛法都是使用筛法思想生成素数表的算法,欧拉筛法的时间复杂度更低。( )

(2 分)
GESP 七级 2024-09 · 判断 第4题 | 知识点 埃氏筛、欧拉筛、时间复杂度
第 35 题 单选 未作答

下⾯关于“唯⼀分解定理”和“素数筛法”的说法中,错误的是( )。

(2 分)
GESP 七级 2026-03 · 单选 第2题 | 知识点 质因数分解、欧拉筛、埃氏筛
第 36 题 单选 未作答

下面 init_sieve 函数的时间复杂度为( )。

01int sieve[MAX_N];
02void init_sieve(int n) {
03    for (int i = 1; i <= n; i++)
04        sieve[i] = i;
05    for (int i = 2; i <= n; i++)
06        for (int j = i; j <= n; j += i)
07            sieve[j]--;
08}

(2 分)
GESP 七级 2024-12 · 单选 第14题 | 知识点 时间复杂度、埃氏筛、程序阅读与输出推断
第 37 题 单选 未作答

下面程序的时间复杂度为( )。

01int primes[MAXP], num = 0;
02bool isPrime[MAXN] = {false};
03void sieve() {
04    for (int n = 2; n <= MAXN; n++) {
05        if (!isPrime[n])
06            primes[num++] = n;
07        for (int i = 0; i < num && n * primes[i] <= MAXN; i++) {
08            isPrime[n * primes[i]] = true;
09            if (n % primes[i] == 0)
10                break;
11        }
12    }
13}

(2 分)
GESP 七级 2025-06 · 单选 第14题 | 知识点 时间复杂度、欧拉筛、程序阅读与输出推断
第 38 题 单选 未作答

下⾯程序的时间复杂度为( )。

01bool notPrime[N] = {false};
02void sieve() {
03    for (int n = 2; n * n < N; n++)
04        if (!notPrime[n])
05            for (int i = n * n; i < N; i += n)
06                notPrime[i] = true;
07}

(2 分)
GESP 八级 2024-06 · 单选 第13题 | 知识点 时间复杂度、埃氏筛
第 39 题 单选 未作答

下面的欧氏筛法程序中,两个横线处应填入的分别是 ( )

01bool isPrime[MAXN + 1] = {false};
02int primes[MAXP], num = 0;
03void sieve() {
04    for (int n = 2; n <= MAXN; n++) {
05        if (!isPrime[n]) primes[num++] = n;
06        for (int i = 0; i < num &&  (此处1); i++) { 
07            if (此处2) 
08                break;
09        }
10    }
11}

(2 分)
GESP 八级 2025-03 · 单选 第11题 | 知识点 程序补全、欧拉筛
第 40 题 单选 未作答

下列程序实现了线性筛法(欧拉筛),用于在 O(n)O(n) 时间内求出 1n1\sim n 之间的所有质数。为了保证每个合数只被其最小质因子筛掉,横线处应填入的语句是( )。

01for (int i = 2; i <= n; i++) {
02    if (!not_prime[i]) primes[++cnt] = i;
03    for (int j = 1; j <= cnt && i * primes[j] <= n; j++) {
04        not_prime[i * primes[j]] = true;
05        if (________) break; // 在此处填入选项
06    }
07}

(2 分)
GESP 八级 2025-12 · 单选 第10题 | 知识点 程序补全、欧拉筛
第 41 题 单选 未作答

下列线性筛的代码片段中,当枚举到质数 ppi % p == 0 时,使用 break 停止继续枚举。这样做的目的是( )。

01for (int i = 2; i <= n; ++i) {
02    if (!is_composite[i])
03        primes.push_back(i);
04    for (int p : primes) {
05        if (i * p > n)
06            break;
07        is_composite[i * p] = true;
08        if (i % p == 0)
09            break;
10    }
11}

(2 分)
GESP 八级 2026-06 · 单选 第13题 | 知识点 欧拉筛、质数判定