初等数论
初等数论
整除、因数、倍数、指数、质(素)数、合数;取整;模运算与取余;整数唯一分解定理;辗转相除法(欧几里得算法)。
概念
初等数论研究整数之间的整除关系。a∣b 表示 b 是 a 的倍数;因数、倍数、质数、合数、唯一分解(每个正整数写成质数乘积的方式唯一)都是基本语言。模运算与取余 % 在 C++ 里结果符号与被除数同号;取整 / 对正整数即向下取整。欧几里得算法 gcd(a,b) 反复用大数除以小数取余,直到余数为 0。与 cspj.math.sieve 的区别:数论考性质与手算(GCD、因子个数、模运算);筛法是专门批量求 1∼n 内质数的算法实现。与 cspj.math.combinatorics 的区别:数论讲「能否整除」,组合讲「有多少种选法」。
CSP-J 常考
cspj-r1-2019第 9 题:100 以内最大的素数(单选,需知 97 为质)。cspj-r1-2020第 13 题:干支纪年——年份对 10、12 取余映射天干地支(模运算应用)。cspj-r1-2023第 27–31 题:阅读程序求 n 的所有因子平方和;判断完全平方因子是否重复计入、质数 p 时结果是否为 p2+1 等。cspj-r1-2021第 29–33 题:阅读线性筛程序,判断约数个数函数 f(n)、因子和 g(n) 的递推与整除性(与筛代码交织,主考点在数论函数)。cspj-r2-2021第 1 题(分糖果):在 [L,R] 中选 k,每次 n 人各取 1 块直到不足 n 块,奖励为剩余 kmodn(不是总糖果数);求最大奖励——区间上取最大余数,R−L≥n−1 时答案为 n−1。
// 欧几里得算法:gcd(a,b)
int gcd(int a, int b) {
while (b) { int t = a % b; a = b; b = t; }
return a;
}
// 枚举 n 的因子(到 sqrt(n))
int factorCount(int n) {
int cnt = 0;
for (int i = 1; i * i <= n; ++i)
if (n % i == 0) cnt += (i * i == n ? 1 : 2);
return cnt;
}
易错点
- 枚举因子只循环到 n,完全平方数 i=n/i 只计一次。
n % i == 0时因子是 i 和 n/i 一对,漏加 n/i 会少算。- 模运算与取余:
(-3) % 5在 C++ 中是 −3,不是 2;阅读题问「余数」要看语言定义。 - 不要把「筛质数」的空位填进本叶子——批量标记
a[i*k]属于cspj.math.sieve。 - 「分糖果」题:反复每人拿 1 块等价于每次减 n,最终剩余是 kmodn;题面求的是奖励(余数),不是 k 本身。
- R−L<n−1 时不能达到 n−1,要在 [L,R] 内枚举可达余数,别直接用
R % n当答案。
100 以内最大的素数是()。
319 和 377 的最大公约数是()。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <cstdio>2#include <cstring>3using namespace std;4char st[100];5int main() {6 scanf("%s", st);7 int n = strlen(st);8 for (int i = 1; i <= n; ++i) {9 if (n % i == 0) {10 char c = st[i - 1];11 if (c >= 'a')12 st[i - 1] = c - 'a' + 'A';13 }14 }15 printf("%s", st);16 return 0;17}- 20单选3 分
若输入的字符串长度为 18,那么输入的字符串跟输出的字符串相比,至多有()个字符不同。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <cstdio>2#include <cstring>3using namespace std;4char st[100];5int main() {6 scanf("%s", st);7 int n = strlen(st);8 for (int i = 1; i <= n; ++i) {9 if (n % i == 0) {10 char c = st[i - 1];11 if (c >= 'a')12 st[i - 1] = c - 'a' + 'A';13 }14 }15 printf("%s", st);16 return 0;17}- 21单选3 分
若输入的字符串长度为(),那么输入的字符串跟输出的字符串相比,至多有 36 个字符不同。
干支纪年法是中国传统的纪年方法,由 10 个天干和 12 个地支组合成 60 个天干地支。由公历年份可以根据以下公式和表格换算出对应的天干地支。
- 天干 =(公历年份)除以 10 所得余数
- 地支 =(公历年份)除以 12 所得余数

例如,今年是 2020 年,2020 除以 10 余数为 0,查表为"庚”;2020 除以 12,余数为 4,查表为“子” 所以今年是庚子年。
请问 1949 年的天干地支是( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
三、完善程序(单选题,每小题 3 分,共计 30 分)
1.(质因数分解)给出正整数 n,请输出将 n 质因数分解的结果,结果从小到大输出。
例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5。输入保证 2≤n≤109。
提示:先从小到大枚举变量 i,然后用 i 不停试除 n 来寻找所有的质因子。
试补全程序。
#include <cstdio>
using namespace std;
int n, i;
int main() {
scanf("%d", &n);
for(i = ①; ② <=n; i ++){
③{
printf("%d ", i);
n = n / i;
}
}
if(④)
printf("%d ", ⑤);
return 0;
}
#include <cstdio>2using namespace std;3int n, i;45int main() {6 scanf("%d", &n);7 for(i = ①; ② <=n; i ++){8 ③{9 printf("%d ", i);10 n = n / i;11 }12 }13 if(④)14 printf("%d ", ⑤);15 return 0;16}- 35(②)单选空位 ②3 分
②处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
三、完善程序(单选题,每小题 3 分,共计 30 分)
1.(质因数分解)给出正整数 n,请输出将 n 质因数分解的结果,结果从小到大输出。
例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5。输入保证 2≤n≤109。
提示:先从小到大枚举变量 i,然后用 i 不停试除 n 来寻找所有的质因子。
试补全程序。
#include <cstdio>
using namespace std;
int n, i;
int main() {
scanf("%d", &n);
for(i = ①; ② <=n; i ++){
③{
printf("%d ", i);
n = n / i;
}
}
if(④)
printf("%d ", ⑤);
return 0;
}
#include <cstdio>2using namespace std;3int n, i;45int main() {6 scanf("%d", &n);7 for(i = ①; ② <=n; i ++){8 ③{9 printf("%d ", i);10 n = n / i;11 }12 }13 if(④)14 printf("%d ", ⑤);15 return 0;16}- 37(④)单选空位 ④3 分
④处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
三、完善程序(单选题,每小题 3 分,共计 30 分)
1.(质因数分解)给出正整数 n,请输出将 n 质因数分解的结果,结果从小到大输出。
例如:输入 n=120,程序应该输出 2 2 2 3 5,表示:120=2×2×2×3×5。输入保证 2≤n≤109。
提示:先从小到大枚举变量 i,然后用 i 不停试除 n 来寻找所有的质因子。
试补全程序。
#include <cstdio>
using namespace std;
int n, i;
int main() {
scanf("%d", &n);
for(i = ①; ② <=n; i ++){
③{
printf("%d ", i);
n = n / i;
}
}
if(④)
printf("%d ", ⑤);
return 0;
}
#include <cstdio>2using namespace std;3int n, i;45int main() {6 scanf("%d", &n);7 for(i = ①; ② <=n; i ++){8 ③{9 printf("%d ", i);10 n = n / i;11 }12 }13 if(④)14 printf("%d ", ⑤);15 return 0;16}- 38(⑤)单选空位 ⑤3 分
⑤处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;34const int n = 100000;5const int N = n + 1;67int m;8int a[N], b[N], c[N], d[N];9int f[N], g[N];1011void init()12{13 f[1] = g[1] = 1;14 for (int i = 2; i <= n; i++) {15 if (!a[i]) {16 b[m++] = i;17 c[i] = 1, f[i] = 2;18 d[i] = 1, g[i] = i + 1;19 }20 for (int j = 0; j < m && b[j] * i <= n; j++) {21 int k = b[j];22 a[i * k] = 1;23 if (i % k == 0) {24 c[i * k] = c[i] + 1;25 f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);26 d[i * k] = d[i];27 g[i * k] = g[i] * k + d[i];28 break;29 }30 else {31 c[i * k] = 1;32 f[i * k] = 2 * f[i];33 d[i * k] = g[i];34 g[i * k] = g[i] * (k + 1);35 }36 }37 }38}3940int main()41{42 init();4344 int x;45 cin >> x;46 cout << f[x] << ' ' << g[x] << endl;47 return 0;48}- 29判断2 分
(2 分) 第 25 行的
f[i] / c[i * k]可能存在无法整除而向下取整的情况。 ( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;34const int n = 100000;5const int N = n + 1;67int m;8int a[N], b[N], c[N], d[N];9int f[N], g[N];1011void init()12{13 f[1] = g[1] = 1;14 for (int i = 2; i <= n; i++) {15 if (!a[i]) {16 b[m++] = i;17 c[i] = 1, f[i] = 2;18 d[i] = 1, g[i] = i + 1;19 }20 for (int j = 0; j < m && b[j] * i <= n; j++) {21 int k = b[j];22 a[i * k] = 1;23 if (i % k == 0) {24 c[i * k] = c[i] + 1;25 f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);26 d[i * k] = d[i];27 g[i * k] = g[i] * k + d[i];28 break;29 }30 else {31 c[i * k] = 1;32 f[i * k] = 2 * f[i];33 d[i * k] = g[i];34 g[i * k] = g[i] * (k + 1);35 }36 }37 }38}3940int main()41{42 init();4344 int x;45 cin >> x;46 cout << f[x] << ' ' << g[x] << endl;47 return 0;48}- 30判断2 分
(2 分) 在执行完
init()后,f数组不是单调递增的,但g数组是单调递增的。 ( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2using namespace std;34const int n = 100000;5const int N = n + 1;67int m;8int a[N], b[N], c[N], d[N];9int f[N], g[N];1011void init()12{13 f[1] = g[1] = 1;14 for (int i = 2; i <= n; i++) {15 if (!a[i]) {16 b[m++] = i;17 c[i] = 1, f[i] = 2;18 d[i] = 1, g[i] = i + 1;19 }20 for (int j = 0; j < m && b[j] * i <= n; j++) {21 int k = b[j];22 a[i * k] = 1;23 if (i % k == 0) {24 c[i * k] = c[i] + 1;25 f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);26 d[i * k] = d[i];27 g[i * k] = g[i] * k + d[i];28 break;29 }30 else {31 c[i * k] = 1;32 f[i * k] = 2 * f[i];33 d[i * k] = g[i];34 g[i * k] = g[i] * (k + 1);35 }36 }37 }38}3940int main()41{42 init();4344 int x;45 cin >> x;46 cout << f[x] << ' ' << g[x] << endl;47 return 0;48}- 32单选3 分
在执行完
init()后,f[1],f[2],f[3]…f[100] 中有()个等于 2。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2using namespace std;34const int n = 100000;5const int N = n + 1;67int m;8int a[N], b[N], c[N], d[N];9int f[N], g[N];1011void init()12{13 f[1] = g[1] = 1;14 for (int i = 2; i <= n; i++) {15 if (!a[i]) {16 b[m++] = i;17 c[i] = 1, f[i] = 2;18 d[i] = 1, g[i] = i + 1;19 }20 for (int j = 0; j < m && b[j] * i <= n; j++) {21 int k = b[j];22 a[i * k] = 1;23 if (i % k == 0) {24 c[i * k] = c[i] + 1;25 f[i * k] = f[i] / c[i * k] * (c[i * k] + 1);26 d[i * k] = d[i];27 g[i * k] = g[i] * k + d[i];28 break;29 }30 else {31 c[i * k] = 1;32 f[i * k] = 2 * f[i];33 d[i * k] = g[i];34 g[i * k] = g[i] * (k + 1);35 }36 }37 }38}3940int main()41{42 init();4344 int x;45 cin >> x;46 cout << f[x] << ' ' << g[x] << endl;47 return 0;48}- 33单选4 分
(4 分) 当输入为 1000 时,输出为()。
分糖果
C++时间 1 s内存 512 MB 文件 IO:candy.in → candy.out
红太阳幼儿园的小朋友们开始分糖果啦!
红太阳幼儿园有 n 个小朋友,你是其中之一。保证 n≥2。
有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分给幼儿园的小朋友们。
由于你只是个平平无奇的幼儿园小朋友,所以你的体力有限,至多只能拿 R 块糖回去。
但是拿的太少不够分的,所以你至少要拿 L 块糖回去。保证 n≤L≤R。
也就是说,如果你拿了 k 块糖,那么你需要保证 L≤k≤R。
如果你拿了 k 块糖,你将把这 k 块糖放到篮子里,并要求大家按照如下方案分糖果:只要篮子里有不少于 n 块糖果,幼儿园的所有 n 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。
作为幼儿园高质量小朋友,你希望让作为你搬糖果的奖励的糖果数量(而不是你最后获得的总糖果数量!)尽可能多;因此你需要写一个程序,依次输入 n,L,R,并输出你最多能获得多少作为你搬糖果的奖励的糖果数量。
输入格式
从文件 candy.in 中读入数据。
输入一行,包含三个正整数 n,L,R,分别表示小朋友的个数、糖果数量的下界和上界。
输出格式
输出到文件 candy.out 中。
输出一行一个整数,表示你最多能获得的作为你搬糖果的奖励的糖果数量。
样例
7 16 23
6
拿 k=20 块糖放入篮子里。
篮子里现在糖果数 20≥n=7,因此所有小朋友获得一块糖;
篮子里现在糖果数变成 13≥n=7,因此所有小朋友获得一块糖;
篮子里现在糖果数变成 6<n=7,因此这 6 块糖是作为你搬糖果的奖励。
容易发现,你获得的作为你搬糖果的奖励的糖果数量不可能超过 6 块(不然,篮子里的糖果数量最后仍然不少于 n,需要继续每个小朋友拿一块),因此答案是 6。
10 14 18
8
容易发现,当你拿的糖数量 k 满足 14=L≤k≤R=18 时,所有小朋友获得一块糖后,剩下的 k−10 块糖总是作为你搬糖果的奖励的糖果数量,因此拿 k=18 块是最优解,答案是 8。
数据范围
对于所有测试数据,保证:
- 2≤n≤L≤R≤109。
| 测试点 | n≤ | R≤ | R−L≤ |
|---|---|---|---|
| 1 | 2 | 5 | 5 |
| 2 | 5 | 10 | 10 |
| 3 | 103 | 103 | 103 |
| 4 | 105 | 105 | 105 |
| 5 | 103 | 109 | 0 |
| 6 | 103 | 109 | 103 |
| 7∼8 | 105 | 109 | 105 |
| 9∼10 | 109 | 109 | 109 |
部分分
- 10 分
测试点 1:n≤2,R≤5,R−L≤5。
- 10 分
测试点 2:n≤5,R≤10,R−L≤10。
- 10 分
测试点 3:n≤103,R≤103,R−L≤103。
- 10 分
测试点 4:n≤105,R≤105,R−L≤105。
- 10 分
测试点 5:n≤103,R≤109,R−L=0。
- 10 分
测试点 6:n≤103,R≤109,R−L≤103。
- 10 分
测试点 7:n≤105,R≤109,R−L≤105。
- 10 分
测试点 8:n≤105,R≤109,R−L≤105。
- 10 分
测试点 9:n≤109,R≤109,R−L≤109。
- 10 分
测试点 10:n≤109,R≤109,R−L≤109。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(1)(枚举因数)从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
#include <bits/stdc++.h>2using namespace std;34int main(){5 int n;6 cin >> n;78 vector<int> fac;9 fac.reserve((int)ceil(sqrt(n)));1011 int i;12 for (i = 1; i * i < n; ++i){13 if (①){14 fac.push_back(i);15 }16 }1718 for (int k = 0; k < fac.size(); ++k){19 cout << ② << "";20 }21 if (③) {22 cout << ④ << "";23 }24 for (int k = fac.size() - 1; k >= 0; --k){25 cout << ⑤ << "";26 }27}- 35(①)单选空位 ①3 分
if (①){
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(1)(枚举因数)从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
#include <bits/stdc++.h>2using namespace std;34int main(){5 int n;6 cin >> n;78 vector<int> fac;9 fac.reserve((int)ceil(sqrt(n)));1011 int i;12 for (i = 1; i * i < n; ++i){13 if (①){14 fac.push_back(i);15 }16 }1718 for (int k = 0; k < fac.size(); ++k){19 cout << ② << "";20 }21 if (③) {22 cout << ④ << "";23 }24 for (int k = fac.size() - 1; k >= 0; --k){25 cout << ⑤ << "";26 }27}- 37(③)单选空位 ③3 分
if (③) {
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(1)(枚举因数)从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
#include <bits/stdc++.h>2using namespace std;34int main(){5 int n;6 cin >> n;78 vector<int> fac;9 fac.reserve((int)ceil(sqrt(n)));1011 int i;12 for (i = 1; i * i < n; ++i){13 if (①){14 fac.push_back(i);15 }16 }1718 for (int k = 0; k < fac.size(); ++k){19 cout << ② << "";20 }21 if (③) {22 cout << ④ << "";23 }24 for (int k = fac.size() - 1; k >= 0; --k){25 cout << ⑤ << "";26 }27}- 38(④)单选空位 ④3 分
cout << ④ << "";
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(1)(枚举因数)从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
#include <bits/stdc++.h>2using namespace std;34int main(){5 int n;6 cin >> n;78 vector<int> fac;9 fac.reserve((int)ceil(sqrt(n)));1011 int i;12 for (i = 1; i * i < n; ++i){13 if (①){14 fac.push_back(i);15 }16 }1718 for (int k = 0; k < fac.size(); ++k){19 cout << ② << "";20 }21 if (③) {22 cout << ④ << "";23 }24 for (int k = fac.size() - 1; k >= 0; --k){25 cout << ⑤ << "";26 }27}- 39(⑤)单选空位 ⑤3 分
cout << ⑤ << "";
解密
C++时间 1 s内存 512 MB 文件 IO:decode.in → decode.out
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi,使 ni=pi×qi、ei×di=(pi−1)(qi−1)+1。
输入格式
从文件 decode.in 中读入数据。
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 ni,di,ei。
输出格式
输出到文件 decode.out 中。
输出 k 行,每行两个正整数 pi,qi 表示答案。
为使输出统一,你应当保证 pi≤qi。
如果无解,请输出 NO。
样例
10 770 77 5 633 1 211 545 1 499 683 3 227 858 3 257 723 37 13 572 26 11 867 17 17 829 3 263 528 4 109
2 385 NO NO NO 11 78 3 241 2 286 NO NO 6 88
数据范围
以下记 m=n−e×d+2。
保证对于 100% 的数据,1≤k≤105,对于任意的 1≤i≤k,1≤ni≤1018,1≤ei×di≤1018,1≤m≤109。
| 测试点编号 | k≤ | n≤ | m≤ | 特殊性质 |
|---|---|---|---|---|
| 1 | 103 | 103 | 103 | 保证有解 |
| 2 | 103 | 103 | 103 | 无 |
| 3 | 103 | 109 | 6×104 | 保证有解 |
| 4 | 103 | 109 | 6×104 | 无 |
| 5 | 103 | 109 | 109 | 保证有解 |
| 6 | 103 | 109 | 109 | 无 |
| 7 | 105 | 1018 | 109 | 保证若有解则 p=q |
| 8 | 105 | 1018 | 109 | 保证有解 |
| 9 | 105 | 1018 | 109 | 无 |
| 10 | 105 | 1018 | 109 | 无 |
部分分
- 10 分
测试点 1:k≤103,n≤103,m≤103,保证有解。
- 10 分
测试点 2:k≤103,n≤103,m≤103,无特殊性质。
- 10 分
测试点 3:k≤103,n≤109,m≤6×104,保证有解。
- 10 分
测试点 4:k≤103,n≤109,m≤6×104,无特殊性质。
- 10 分
测试点 5:k≤103,n≤109,m≤109,保证有解。
- 10 分
测试点 6:k≤103,n≤109,m≤109,无特殊性质。
- 10 分
测试点 7:k≤105,n≤1018,m≤109,保证若有解则 p=q。
- 10 分
测试点 8:k≤105,n≤1018,m≤109,保证有解。
- 10 分
测试点 9:k≤105,n≤1018,m≤109,无特殊性质。
- 10 分
测试点 10:k≤105,n≤1018,m≤109,无特殊性质。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int solve1(int n){6 return n*n;7}89int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21}22int main(){23 int n;24 cin>>n;25 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;26 return 0;27}- 27判断1.5 分
如果输入的 n 为正整数,
solve2函数的作用是计算 n 所有的因子的平方和( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int solve1(int n){6 return n*n;7}89int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21}22int main(){23 int n;24 cin>>n;25 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;26 return 0;27}- 28判断1.5 分
第 13∼14 行的作用是避免 n 的平方根因子 i(或 n/i )进入第 16 行而被计算两次( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int solve1(int n){6 return n*n;7}89int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21}22int main(){23 int n;24 cin>>n;25 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;26 return 0;27}- 29判断1.5 分
如果输入的 n 为质数,
solve2(n)的返回值为 n2+1( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int solve1(int n){6 return n*n;7}89int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21}22int main(){23 int n;24 cin>>n;25 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;26 return 0;27}- 30单选4 分
单选题
- (4分)如果输入的 n 为质数 p 的平方,那么
solve2(n)的返回值为( )
- (4分)如果输入的 n 为质数 p 的平方,那么
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <iostream>2#include <cmath>3using namespace std;45int solve1(int n){6 return n*n;7}89int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21}22int main(){23 int n;24 cin>>n;25 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;26 return 0;27}- 31单选3 分
当输入为正整数时,第一项减去第二项的差值一定( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;34bool isPrime(int n) {5 if (n <= 1) {6 return false;7 }8 for (int i = 2; i * i <= n; i++) {9 if (n % i == 0) {10 return false;11 }12 }13 return true;14}1516int countPrimes(int n) {17 int count = 0;18 for (int i = 2; i <= n; i++) {19 if (isPrime(i)) {20 count++;21 }22 }23 return count;24}2526int sumPrimes(int n) {27 int sum = 0;28 for (int i = 2; i <= n; i++) {29 if (isPrime(i)) {30 sum += i;31 }32 }33 return sum;34}3536int main() {37 int x;38 cin >> x;39 cout << countPrimes(x) << " " << sumPrimes(x) << endl;40 return 0;41}- 17判断1.5 分
若将
isPrime(i)函数中的条件改为i<=n/2,输入 20 时,countPrimes(20)的输出将变为 6。()
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
#include <iostream>2using namespace std;34bool isPrime(int n) {5 if (n <= 1) {6 return false;7 }8 for (int i = 2; i * i <= n; i++) {9 if (n % i == 0) {10 return false;11 }12 }13 return true;14}1516int countPrimes(int n) {17 int count = 0;18 for (int i = 2; i <= n; i++) {19 if (isPrime(i)) {20 count++;21 }22 }23 return count;24}2526int sumPrimes(int n) {27 int sum = 0;28 for (int i = 2; i <= n; i++) {29 if (isPrime(i)) {30 sum += i;31 }32 }33 return sum;34}3536int main() {37 int x;38 cin >> x;39 cout << countPrimes(x) << " " << sumPrimes(x) << endl;40 return 0;41}- 18判断1.5 分
sumPrimes函数计算的是从 2 到 n 之间的所有素数之和。
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 A,错误填 B
#include <algorithm>2#include <cstdio>3#include <cstring>4inline int gcd(int a, int b) {5 if (b == 0)6 return a;7 return gcd(b, a % b);8}9int main() {10 int n;11 scanf("%d", &n);12 int ans = 0;13 for (int i = 1; i <= n; ++i) {14 for (int j = i + 1; j <= n; ++j) {15 for (int k = j + 1; k <= n; ++k) {16 if (gcd(i, j) == 1 && gcd(j, k) == 117 && gcd(i, k) == 1) {18 ++ans;19 }20 }21 }22 }23 printf("%d\n", ans);24 return 0;25}- 17判断1.5 分
将第 16 行中的
&& gcd(i,k)==1删去不会影响程序运行结果。( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
#include <algorithm>2#include <cstdio>3#include <cstring>4inline int gcd(int a, int b) {5 if (b == 0)6 return a;7 return gcd(b, a % b);8}9int main() {10 int n;11 scanf("%d", &n);12 int ans = 0;13 for (int i = 1; i <= n; ++i) {14 for (int j = i + 1; j <= n; ++j) {15 for (int k = j + 1; k <= n; ++k) {16 if (gcd(i, j) == 1 && gcd(j, k) == 117 && gcd(i, k) == 1) {18 ++ans;19 }20 }21 }22 }23 printf("%d\n", ans);24 return 0;25}- 21单选3 分
调用 gcd(36,42) 会返回( )。