C++ 给定一个数的素因子分解生成该数的所有因子

C++ 给定一个数的素因子分解生成该数的所有因子,c++,c,algorithm,primes,factorization,C++,C,Algorithm,Primes,Factorization,我想找到[1107]范围内的所有数字除数。我知道它可以在O(sqrt(n))中求解。但在此之前必须运行Eratosthenes筛,该筛可以很容易地修改以获得一个数的素因子分解(通过跟踪每个数的一个素因子)。所以我想知道,使用它的素因子分解生成所有因子会更有效吗? 设n=p1k1*p2k2*…*pmkm 我认为这个符号可以在筛后的O(m+∑ki)中得到。 经过一番思考,我想出了以下代码来生成因子: int factors[]={2,5}; // array containing al

我想找到[1107]范围内的所有数字除数。我知道它可以在O(sqrt(n))中求解。但在此之前必须运行Eratosthenes筛,该筛可以很容易地修改以获得一个数的素因子分解(通过跟踪每个数的一个素因子)。所以我想知道,使用它的素因子分解生成所有因子会更有效吗?
设n=p1k1*p2k2*…*pmkm

我认为这个符号可以在筛后的O(m+∑ki)中得到。
经过一番思考,我想出了以下代码来生成因子:

int factors[]={2,5};        // array containing all the factors
int exponents[]={2,2};      // array containing all the exponents of factors
                            // exponents[i] = exponent of factors[i]
vector <int> ans;           // vector to hold all possible factors

/*
*   stores all possible factors in vector 'ans'
*   using factors and exponents from index l to r(both inclusive)
*/
void gen(int factors[],int exponents[],vector<int>& ans,int l,int r)
{
    if(l==r)                        
    {
        int temp = 1;
        for(int i=0;i<=exponents[l];i++)
        {
            ans.push_back(temp);
            temp *= factors[l];
        }
        return;
    }
    gen(factors,exponents,ans,l+1,r);
    int temp=factors[l];
    int size = ans.size();
    for(int i=1;i<=exponents[l];i++)
    {
        for(int j=0;j<size;j++)
        {
            ans.push_back(ans[j]*temp);
        }
        temp *= factors[l];
    }
}
int factors[]={2,5};//包含所有因子的数组
整数指数[]={2,2};//包含所有因子指数的数组
//指数[i]=因子的指数[i]
向量ans;//向量来容纳所有可能的因素
/*
*将所有可能的因子存储在向量“ans”中
*使用从指数l到r的因子和指数(包括两者)
*/
void gen(整数因子[],整数指数[],向量和ans,整数l,整数r)
{
如果(l==r)
{
内部温度=1;

对于(int i=0;i来说,第一个最明显的优化是预先分配答案向量。您确切地知道将有多少个因素(因为您已经给出了如下公式∏(1+ki))

如果您自己管理堆栈而不是使用递归,您将获得最佳解决方案(每个因子只需要1次查找和1次乘法)

像这样的

int factors_count = 1;
for (int i = 0; i < r; ++i)
{
    factors_count *= 1+exponents[i];
}
ans.resize(factors_count);
ans[0] = 1;
int count = 1;
for (int stack_level = 0; stack_level < r; ++stack_level)
{
    const int count_so_far = count;
    const int prime = factors[stack_level];
    const int exponent = exponents[stack_level];
    int multiplier = 1;
    for (int j = 0; j < exponent; ++j)
    {
        multiplier *= prime;
        for (int i = 0; i < count_so_far; ++i)
        {
            ans[count++] = ans[i] * multiplier;
        }
    }
}
int factors\u count=1;
对于(int i=0;i
我甚至还没有试过编译它,所以请注意