2011-11-07 5 views
-1

配列内の特定の数値の素因数を返す関数を作ろうとしていますが、配列を使用しようとしています。C++のint配列ポインタを素因数を見つけるために再帰的に返します

例えば、私が12に入れた場合、私は2と2と3を、2と3はセットと同じようにしたい。これは、私がそれがSmith numberであるかどうかを見るために使うことができるように、私は数字を別に必要とします。

また、私は再帰的アプローチを取っています。

私は配列を格納するスペースを指すコードに初期ポインタを渡すなど、多くの方法で配列を返そうとしました。

私は関数の配列を初期化してから、それを返してみました。

私は、基本ケースの反復から配列を戻すことができます。そして、値をコピーするためにサイズoldArray+1の新しい配列を作成しようとすると、物事が乱雑になります。これは私が迷子になる場所です。

これは最も効率的な実装ではありませんが、私はそれを動作させることができるはずです。

私は、と与えられた関数nextPrime(int 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を返すように見えるのでしょうか?

答えて

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; 
} 

+0

ありがとうございました!!!私は両方の答えを見た後すぐに働いています。とても有難い。 – Blue42

1

これにはstd::vectorを使用する必要があります。あなたが持っている主な問題は、配列へのポインタが配列に含まれる項目の数を知る方法がないということです。具体的には、sizeof(factors)と言う部分が間違っています。私が理解しているように、あなたは配列内の項目の数がfactorsであることを期待していますが、実際にはintへのポインタを格納するのに必要なバイト数が与えられます。

vector<int>を返すか、参照として渡して、要因を見つけるたびに更新する必要があります。