1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | /****************************************************************
* Description: 顺序打印因数
* Author: Alex Li
* Date: 2023-08-16 06:46:49
* LastEditTime: 2023-09-13 05:59:07
****************************************************************/
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> fac; //定义一个动态数组
//sqrt(n)是取n的平方根,如果是小数,就用ceil上取整数,并把结果类型转成整数
//fac.reserve是根据括号内的值保留数组空间。
fac.reserve((int)ceil(sqrt(n)));
int i;
//将1~i(i*i<n)内所有n的整数因子按顺序存到fac数组里面。
for (i = 1; i * i < n; ++i){
if (n%i==0){ //空1,看i是否是n的因数
fac.push_back(i);
}
}
//输出fac数组内的整数,因数是从小到大
for (int k = 0; k < fac.size(); ++k){
cout <<fac[k] << " "; //空2,输出因数
}
//如果n有整数平方根,输出。这里i在上一个循环结束时,是i*i不小于n,所以有可能i*i==n
if (i*i==n) { //空3
cout << i << " "; //空4,l输出n的平方根
}
//因为题目要求是从小到大打印因数,所以i~n里的因数,用n/fac[k],k从大的开始,这样出来的是升序。
for (int k = fac.size() - 1; k >= 0; --k){
cout << n/fac[k]<< " "; //空5,输出大于sqrt(n)的因数
}
}
|