2

これが私がこれまでに持っているものです:

//project Eular Problem 4: Prime Factors
#include<iostream>
#include<cmath>
typedef unsigned long long int uint_64;
using namespace std;

void storeFactors(uint_64 factors[], uint_64 num)
{
    for(uint_64 i=0;i*i<num;i++
       factors[i]=1;       //assign 1 to all the values

    for(uint_64 j=2; j*j<num;j++){
       if(num%j!=0)
          factors[j]=0;       //assign 0 to non-factors
    } 
}  

//Sieve of Eratosthenes to generate primes
void gen_primes(uint_64 arr[],uint_64 firstElement, uint_64 lastElement, uint_64 size)
{
    for(uint_64 i=0;i<size;i++)   //assigning 1 to all the values
       arr[i]=1;

    for(uint_64 i=2;i*i<=lastElement;i++){   //loop until the square-root of n
       if(arr[i])
          for(uint_64 j=i;j*i<=lastElement;j++)      //eliminate multiples by assigning them 0
            arr[j*i]=0;
       if(firstElement==1)
          arr[firstElement]=0;
    }
}

void arrayComp(uint_64 factors[],uint_64 primeArray[], uint_64 size)
{
    for(uint_64 i=2; i<=size; i++){
        if(factors[i] && primeArray[i]){
                cout<<i<<endl;
        }
    }
}

void processFactors(uint_64 num)
{
    uint_64 size = sqrt(num);
    uint_64 *factors = new uint_64[size];
    uint_64 *primeArray = new uint_64[size];

    storeFactors(factors, num);
    gen_primes(primeArray, 2, num, size);
    arrayComp(factors, primeArray,size);

    delete [] factors;
    delete [] primeArray;
}

int main()
{
    uint_64 number;
    cout<<"Enter a number: "<<endl;
    cin>>number;
    cout<<"The prime factors of "<<number<<" are: "<<endl;
    processFactors(number);

    return 0;
}

ふるいアプローチで係数を計算してみました。すべての非因子には0が割り当てられます。ArrayCompは、両方が入力の因子であり、素数でもある場合に数値を表示します。

私が抱えている問題は、出力が完全ではなく、プログラムがセグメンテーション違反に遭遇することです。たとえば、10の係数は5と2ですが、100の場合も同じ答えを示します。

編集:私があまり自信がないもう1つのことは、配列のサイズです。このプログラムでは、7ではなく21の素因数として3が表示されますが、サイズを1増やすと、3と5が表示されます(正しくありません)。

4

2 に答える 2

7

100の素因数は10の素因数と同じですが、多重度のみが異なります。

あなたの表現には、繰り返される因子を保存する方法がないようです。

于 2011-10-17T15:58:05.100 に答える
1
uint_64 size = sqrt(num);
uint_64 *factors = new uint_64[size];
uint_64 *primeArray = new uint_64[size];

リザーブサイズが間違っています。

元。)

num = 10

サイズ=3

10の係数=2、5

    if(factors[i] && primeArray[i]){
            cout<<i<<endl;
    }

要因[5]?その場合、配列サイズは3(0,1,2)です。

于 2011-10-17T23:21:47.237 に答える