这段代码的功能是获取一个正整数的所有因数,并按升序输出这些因数。以下是代码的详细思路解析:
1. 问题背景
给定一组正整数,需要找出每个数的所有因数,并按升序输出这些因数。因数是指能够整除给定数的正整数。
2. 代码逻辑解析
(1) 获取因数的函数
vector<int> get_divisors(int x)
{
vector<int> res;
for (int i = 1; i <= x / i; i++)
{
if (x % i == 0)
{
res.push_back(i); // i 是 x 的因数
if (i != x / i) res.push_back(x / i); // x / i 也是 x 的因数,避免重复
}
}
sort(res.begin(), res.end()); // 对因数进行排序
return res;
}
-
输入:一个正整数
x
。 -
输出:一个包含
x
的所有因数的向量res
。 -
逻辑:
-
外层循环:
-
从1遍历到
sqrt(x)
(即x / i
),检查x
是否能被i
整除。
-
-
内层逻辑:
-
如果
x
能被i
整除,说明i
是x
的因数,将其加入结果向量res
。 -
同时,
x / i
也是x
的因数,除非i
和x / i
相等(即i
是x
的平方根),否则也将x / i
加入结果向量。
-
-
排序:
-
对结果向量
res
进行排序,确保因数按升序排列。
-
-
(2) 主函数
int main()
{
int n; cin >> n; // 输入测试用例的数量
while (n--)
{
int x; cin >> x; // 输入一个整数
auto res = get_divisors(x); // 获取 x 的所有因数
for (auto x : res) cout << x << ' '; // 输出每个因数
cout << endl; // 换行
}
return 0;
}
-
输入:测试用例的数量
n
,然后是n
个正整数。 -
逻辑:
-
使用一个循环处理每个测试用例。
-
对于每个整数
x
,调用get_divisors
函数获取其所有因数。 -
遍历结果向量
res
,输出每个因数,并在每个测试用例结束后换行。
-
3. 示例运行
输入:
3
6
8
10
运行过程:
-
输入测试用例数量
n = 3
。 -
输入3个整数:6, 8, 10。
-
对每个整数调用
get_divisors
函数:-
get_divisors(6)
:-
因数:1, 2, 3, 6
-
-
get_divisors(8)
:-
因数:1, 2, 4, 8
-
-
get_divisors(10)
:-
因数:1, 2, 5, 10
-
-
输出:
1 2 3 6
1 2 4 8
1 2 5 10
4. 总结
这段代码的核心思路是通过一个高效的函数 get_divisors
,结合主函数中的循环,逐个获取输入的整数的所有因数,并按升序输出这些因数。这种方法适用于处理一组正整数的因数分解问题。
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
// 函数用于获取一个整数的所有约数
std::vector<int> get_divisors(int x) {
std::vector<int> res;
// 从 1 到 sqrt(x) 遍历
for (int i = 1; i <= x / i; ++i) {
if (x % i == 0) {
res.push_back(i);
// 如果 i 不等于 x / i,则将 x / i 也加入结果集
if (i != x / i) {
res.push_back(x / i);
}
}
}
// 对结果集进行排序
std::sort(res.begin(), res.end());
return res;
}
int main() {
int n;
std::cin >> n;
while (n--) {
int x;
std::cin >> x;
auto res = get_divisors(x);
for (auto num : res) {
std::cout << num << ' ';
}
std::cout << std::endl;
}
return 0;
}