快速枚举一个数的所有因数

#include<bits/stdc++.h>
using namespace std;

int x,cntd,d[510];
int cnt,isprime[510],ci[510];//isprime存因数,ci存每个因数出现的次数 

void chai(int n){
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            isprime[++cnt]=i;
            while(n%i==0){
                n/=i;
                ci[cnt]++;
            }
        } 
    }
    if(n>1){
        isprime[++cnt]=n;
        ci[cnt]=1;
    }
//    for(int i=1;i<=cnt;i++) cout<<isprime[i]<<" "<<ci[i]<<endl;
}

void dfs(int p,int n){
    if(p>cnt){
        d[++cntd]=n;
        return;
    }
    for(int i=0;i<=ci[p];i++){
      dfs(p+1,n);
      n*=isprime[p];
    }
}

int main(){
    cin>>x;
    chai(x);
    dfs(1,1);
    sort(d+1,d+1+cntd);
    for(int i=1;i<=cntd;i++){
        cout<<d[i]<<" "; 
    }
    cout<<endl;
    return 0;
} 

 

posted @ 2021-02-03 00:05  DReamLion  阅读(676)  评论(0编辑  收藏  举报