【题目】
CSP-J 2022 入门级 第一轮 完善程序(1) 第35-39题
(枚举因数) 从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int main() {
05 int n;
06 cin >> n;
07
08 vector<int> fac;
09 fac.reserve((int)ceil(sqrt(n)));
10
11 int i;
12 for (i = 1; i * i < n; ++i) {
13 if ( ① ) {
14 fac.push_back(i);
15 }
16 }
17
18 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 }
- ①处应填()
A. n % i == 0
B. n % i == 1
C. n % (i-1) == 0
D. n % (i-1) == 1 - ②处应填( )
A. n / fac[k]
B. fac[k]
C. fac[k]-1
D. n / (fac[k]-1) - ③处应填( )
A. (i-1) * (i-1) == n
B. (i-1) * i == n
C. i * i == n
D. i * (i-1) == n - ④处应填( )
A. n-i
B. n-i+1
C. i-1
D. I - ⑤处应填( )
A. n / fac[k]
B. fac[k]
C. fac[k]-1
D. n / (fac[k]-1)
【题目考点】
1. stl vector
-
声明vector对象:
vector<数据类型> 对象名
例:vector<int> vec;
(以下示例中vec表示vector对象) -
vec.capacity()
返回vec的容量。
vector对象的容量指当前已经分配给该对象的内存空间。vector对象会根据保存数据的数量自动改变自身的容量。当元素数量增加时,会让容量依次变为1,2,4,8,16…,但在元素减少时不会自动减少容量。 -
vec.reserve(容量)
,手动设置vector的容量,预先为vector对象分配空间,以免在运行过程中触发扩容。
2. 因数
【解题思路】
05 int n;
06 cin >> n;
08 vector<int> fac;
09 fac.reserve((int)ceil(sqrt(n)));
先输入了n
第8行声明了一个vector类对象,名字为fac。factor是因数的意思,所以fac这个vector保存的是因数。
第9行,ceil是向上取整(返回值类型是double),sqrt是开根号。第9行做的事情是把fac的容量设为
⌈
n
⌉
\lceil\sqrt{n}\rceil
⌈n⌉
11 int i;
12 for (i = 1; i * i < n; ++i) {
13 if ( ① ) {
14 fac.push_back(i);
15 }
16 }
这里就是把n的所有
i
2
<
n
i^2<n
i2<n的因数保存在fac之中。
数字i若是n的因数,那么n能整除i,n除以i的余数为0。第35题选A:n % i == 0。
18 for (int k = 0; k < fac.size(); ++k) {
19 cout << ② << " ";
20 }
因为要从小到大打印n的所有因数,所以这里先把fac中所有满足 i 2 < n i^2<n i2<n的因数输出。输出fac中的第k个元素:fac[k]。第36题选B。
21 if ( ③ ) {
22 cout << ④ << " ";
23 }
接着是看是否有
i
2
=
n
i^2=n
i2=n的情况,如果有则输出i。
第37题选C:i*i==n,第38题选D: i。
24 for (int k = fac.size() - 1; k >= 0; --k) {
25 cout << ⑤ << " ";
26 }
最后输出
i
2
>
n
i^2>n
i2>n的n的因数i。
假设fac中的元素是a, b, c, d,
那么接下来应该输出n/d, n/c, n/b, n/a。
fac中的元素为:fac[0], fac[1], …, fac[fax.size()-1],接下来应该输出的是:n/fac[fax.size()-1], n/fac[fax.size()-2], …, n/fac[0]。
所以第39题选A:n/fac[k]
【答案】
- A
- B
- C
- D
- A