CSP-J 2022 入门级 第一轮 完善程序(1) 第35-39题

【题目】

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 }
  1. ①处应填()
    A. n % i == 0
    B. n % i == 1
    C. n % (i-1) == 0
    D. n % (i-1) == 1
  2. ②处应填( )
    A. n / fac[k]
    B. fac[k]
    C. fac[k]-1
    D. n / (fac[k]-1)
  3. ③处应填( )
    A. (i-1) * (i-1) == n
    B. (i-1) * i == n
    C. i * i == n
    D. i * (i-1) == n
  4. ④处应填( )
    A. n-i
    B. n-i+1
    C. i-1
    D. I
  5. ⑤处应填( )
    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]

【答案】

  1. A
  2. B
  3. C
  4. D
  5. A

おすすめ

転載: blog.csdn.net/lq1990717/article/details/127015221