Acwing 869. 试除法求约数 数学

63 阅读1分钟

869. 试除法求约数 - AcWing题库

思想 这道题就是用到了试除法,即从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;
    
}