思想 这道题就是用到了试除法,即从1开始枚举所有数,O(n)。
再从这些数里判断是否有数s是n的约数,O(√n)
总共时间复杂度为O(n√n)。
注意事项 去重
如果n是一个完全平方数,比如 4 16 9 这种的,它们都要两个完全一样的约数。
但是我们只要一个就够了,所以我们要特判一下:
i是一个约束,n/i是另一个约束,当i==n/i的时候,说明之前已经添加过i了,那么n/i和i是相同的,n/i就不用再添加了。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> get_divisors(int n)
{
vector<int> res;
for(int i=1;i<=n/i;i++)
{
if(n%i==0)//可以被约尽,是约束
{
res.push_back(i);//就添加
if(i!=n/i)res.push_back(n/i);//特判,不重复的话才添加
}
} sort(res.begin(),res.end());
return res;
}
vector<int>res;
int main()
{
int t=0;
cin>>t;
while(t--)
{
int x=0;
cin>>x;
auto res=get_divisors(x);
for(auto t:res)cout<<t<<' ';
cout<<endl;
}
return 0;
}