58.Acwing基础课第869题-简单-试除法求约数

58.Acwing基础课第869题-简单-试除法求约数

题目描述

给定一个正整数 \(n\) ,请你求出 1∼ \(n\) 中质数的个数。

给定\(n\)个正整数 \(a_i\),对于每个整数 \(a_i\),请你按照从小到大的顺序输出它的所有约数。

输入格式

第一行包含整数 \(n\)

接下来 \(n\) 行,每行包含一个整数 \(a_i\)

输出格式

输出共 \(n\) 行,其中第\(i\) 行输出第\(i\)个整数 \(a_i\)的所有约数。

输出格式

数据范围
1≤\(n\)​≤100

1≤\(a_i\)≤2×109

输入样例:

2
6
8

输出样例:

1 2 3 6 
1 2 4 8 

代码:

// 包含标准输入输出头文件(cin/cout依赖)
#include <iostream>
// 包含算法库(sort排序函数依赖)
#include <algorithm>
// 包含向量容器头文件(存储约数的动态数组)
#include <vector>

// 使用std命名空间,避免重复写std::
using namespace std;

// 核心函数:求解正整数x的所有约数,并返回排序后的约数列表
// 约数定义:能整除x的正整数(如x=6的约数为1、2、3、6)
vector<int> get_divisors(int x)
{
    vector<int> res; // 动态数组res:存储x的所有约数
    // 枚举1到√x的所有数(i <= x/i 等价于 i <= sqrt(x),避免浮点精度误差)
    // 优化逻辑:若i是x的约数,则x/i也必然是x的约数,只需枚举到√x即可,时间复杂度O(√x)
    for (int i = 1; i <= x / i; i ++ )
        // 若i能整除x,说明i是x的一个约数
        if (x % i == 0)
        {
            res.push_back(i); // 将约数i加入结果数组
            // 去重处理:避免重复添加平方数的情况(如x=4,i=2,x/i=2,此时只加一次2)
            if (i != x / i) res.push_back(x / i);
        }
    // 对约数数组排序,保证输出结果从小到大(如x=12,枚举得到1、12、2、6、3、4,排序后为1 2 3 4 6 12)
    sort(res.begin(), res.end());
    return res; // 返回排序后的约数列表
}

int main()
{
    int n; // n:测试用例的组数
    cin >> n; // 输入测试用例组数

    // 循环处理n组测试用例
    while (n -- )
    {
        int x; // x:当前需要求解约数的正整数
        cin >> x; // 输入待求解约数的数
        auto res = get_divisors(x); // 调用函数,获取x的所有约数(auto自动推导类型为vector<int>)

        // 遍历约数数组,逐个输出所有约数(空格分隔)
        for (auto x : res) cout << x << ' ';
        // 每组测试用例输出完成后换行,分隔不同输入的结果
        cout << endl;
    }

    return 0; // 程序正常结束
}
posted @ 2026-04-09 14:57  CodeMagicianT  阅读(1)  评论(0)    收藏  举报