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; // 程序正常结束
}

浙公网安备 33010602011771号