试除法求约数

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;
}

posted @ 2022-06-26 19:13  lucky_light  阅读(68)  评论(0编辑  收藏  举报