我正在尝试创建一个函数,它可以返回数组中给定数字的素数因子(或多集,但我正在尝试使用数组)。
例如,如果我输入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?
答案 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>
或将其作为参考传递,并在每次找到因素时更新它。