我的Eratosthenes计划筛选发生了什么?

时间:2016-02-07 22:00:44

标签: c++ codeblocks

我正在努力解决一个挑战问题,即总计200万以下的所有素数。完全了解一个天真的方法将花费太长时间,我决定实施The Eratosthenes Sieve with a counter来记录总和。它适用于高达512500,之后我收到此错误:

enter image description here

输入大小是否太大而无法处理代码?如果是这种情况,我如何改进我的代码以避免此错误。如果那是不可能的,那么为实现这些目的而实施的更好的算法是什么?

这是我的标题代码:

#ifndef NUMBERSIEVE_H
#define NUMBERSIEVE_H


class NumberSieve
{
    public:
        NumberSieve();
        virtual ~NumberSieve();
        int EratosthenesSieve(int num);
    private:
        void SetSieve(int nums[],int Size);
        int current_prime;
        int current_prime_address;
        void updateSieve(int nums[],int Size,int start);
        bool updateCurrentPrime(int nums[],int Size,int start);
        bool notComplete;
        void printSieve(int nums[],int Size);
        int primeSum;
};

#endif // NUMBERSIEVE_H

这是我的实施文件:

#include "NumberSieve.h"
#include <cstdlib>
#include <iostream>
NumberSieve::NumberSieve()
{
    //ctor
}

NumberSieve::~NumberSieve()
{
    //dtor
}
void NumberSieve::SetSieve(int nums[],int Size)
{
    for(int i=0;i<Size;i++)
    {
        nums[i]=(i+1);
    }
    nums[0]=0;//Sets the first composite number 1 to 0. We use 0 as an analogy for "crossing out numbers in the Sieve".
}
void NumberSieve::updateSieve(int nums[],int Size,int start)
{
    int CURRENT_PRIME=nums[start];
    for(int i=start;i<Size;i++)
    {
        if(nums[i]%CURRENT_PRIME==0)
        {
            nums[i]=0;
        }
    }
    nums[start]=CURRENT_PRIME;
}
bool NumberSieve::updateCurrentPrime(int nums[],int Size,int start)
{
    for(int i=start+1;i<Size;i++)
    {
        if(nums[i]!=0)
        {
            primeSum+=nums[i];
            current_prime=nums[i];
            current_prime_address=i;
            return true;
        }
    }
    return false;
}
void NumberSieve::printSieve(int nums[],int Size)
{
    for(int i=0;i<Size;i++)
    {
        std::cout<<nums[i]<<std::endl;
    }
}
int NumberSieve::EratosthenesSieve(int num)
{
    int Eratosthenes[num];
    int primeSum=0;
    SetSieve(Eratosthenes,num);
    current_prime=2;
    primeSum+=2;
    current_prime_address=1;
    updateSieve(Eratosthenes,num,current_prime_address);
    notComplete=updateCurrentPrime(Eratosthenes,num,current_prime_address);
    while(notComplete)
    {
        updateSieve(Eratosthenes,num,current_prime_address);
        notComplete=updateCurrentPrime(Eratosthenes,num,current_prime_address);
    }
    return primeSum;
}

1 个答案:

答案 0 :(得分:2)

我最好的猜测是stackoverflow,因为:

clipTo()

而是尝试从免费商店获取它:

int Eratosthenes[num];

相应地更新其余代码

如果你对指针感到不舒服,可能是另一种选择。