C ++ int数组指针以递归方式查找素数因子

时间:2011-11-07 21:21:26

标签: c++ arrays pointers recursion

我正在尝试创建一个函数,它可以返回数组中给定数字的素数因子(或多集,但我正在尝试使用数组)。

例如,如果我输入12,我想得到2,2和3,而不是2和3就像一套。这样我就可以使用这些来查看它是否是Smith number,所以我需要单独编号。

另外,我采取递归方式。

我已尝试(无效)以多种方式返回数组,包括将初始指针传递到指向存储数组的空间的代码中。

我试过在函数中初始化数组然后返回它。

据我所知,我可以从基本情况迭代中获取数组,然后在尝试构造一个大小为oldArray+1的新数组来复制值时,事情会变得混乱。这就是我迷路的地方。

从我读过的内容来看,虽然这不是最有效的实现,但我应该能够让它发挥作用。

我有一个函数nextPrime(int n),给定n将从该数字返回下一个素数。

参见下面的来源:

int* find(int n, int p) {

int root = (int) floor(sqrt(n));
if (p > root) {
    // Base case, array gets initialized and returned
    // depending on value of n and p.
    if (n > 1) {
        factors = new int[1];
        factors[0] = n;
        return factors;
    }
    else {
        factors = new int[0];
        return factors;
    }
}
else
    if (n%p == 0){
        // Inductive step if p is a factor
        int newFloor = (int) floor(n/p);
        factors = find(newFloor, p);

        // Initialize new array.
        int* newFactors;
        newFactors = new int[(sizeof(factors) / sizeof(int)) + 1];

        // Add p to first slot, fill rest with contents of factors.
        factors[0] = p;
        for (int i = 0; i < (sizeof(factors) / sizeof(int)); i++) {
            newFactors[i+1] = factors[i];
        }

        return newFactors;
    }
    else {
        // Inductive step p isn't a factor of n
        factors = find(n, factors, nextPrime(p));
        return factors;
    }
}

正如我所说,错误是返回数组并使用其值,但为什么它似乎从第一次迭代返回OK?

2 个答案:

答案 0 :(得分:1)

这样的事情可行。效率不高!!

void FindFactors( int number , std::vector<int>&  factors )
{
    for ( int i = 2; i <= number; ++i )
    {
        if ( number % i == 0 )
        {
            factors.push_back( i );
            FindFactors( number / i , factors);
            break;
        }
    }
}

int main()
{

    std::vector<int> factors;
    FindFactors( 121 , factors );
    return 0;
}

调用函数后,因子将仅包含素数因子。

答案 1 :(得分:1)

您应该使用std::vector。您遇到的主要问题是指向数组的指针无法知道数组包含的项目数。具体而言,您说sizeof(factors)的部分是错误的。据我所知,您希望能够提供factors指向的数组中的项目数,但它确实为您提供了存储指向int的指针所需的字节数。 / p>

您应该返回vector<int>或将其作为参考传递,并在每次找到因素时更新它。