试除法求所有约数C++模板:
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);
if(i!=x/i)res.push_back(x/i);
}
}
sort(res.begin(),res.end());
return res;
}
试除法求所有约数理解:
我们可以知道一个数n能被x约,那么n也能被n/x约,他们通常都会有一大一小,那么在枚举小的时候同时也把大的约数加入,这样可以减少一半的时间
题目: AcWing 869. 试除法求约数
给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai。
输出格式
输出共 n 行,其中第 i 行输出第 i 个整数 ai 的所有约数。
数据范围
1≤n≤100,
2≤ai≤2×109
输入样例:
2
6
8
输出样例:
1 2 3 6
1 2 4 8
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
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);
if(i!=x/i)res.push_back(x/i);
}
}
sort(res.begin(),res.end());
return res;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
vector<int> divs=get_divisors(x);
for(int i=0;i<divs.size();i++)
{
cout<<divs[i]<<" ";
}
cout<<endl;
}
return 0;
}