试除法求约数
c++
试除法求约数,复杂度 \(O(n^{\frac{1}{2}})\)
/*
* 试除法求约数
* 算法概述:
* 给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。
*
* 算法较为简单,同样是 O(N^0.5)的复杂度
*/
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
void get_all_divisors(int x) {
vector<int> top, bottom;
for (int i = 1; i <= x / i; i ++ ) {
if (x % i == 0) {
if (i * i == x) {
top.push_back(i);
break;
} else {
top.push_back(i);
bottom.push_back(x / i);
}
}
}
printf("%d", top[0]);
for (int i = 1; i < top.size(); i ++ ) {
printf(" %d", top[i]);
}
for (int i = bottom.size() - 1; i >= 0; i -- ) {
printf(" %d", bottom[i]);
}
printf("\n");
}
int main()
{
scanf("%d", &n);
int x;
while (n -- ) {
scanf("%d", &x);
get_all_divisors(x);
}
return 0;
}